machineconfig 5.86__py3-none-any.whl → 5.88__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 (33) hide show
  1. machineconfig/jobs/installer/installer_data.json +6 -6
  2. machineconfig/profile/create_links_export.py +9 -9
  3. machineconfig/scripts/python/agents.py +17 -17
  4. machineconfig/scripts/python/croshell.py +1 -1
  5. machineconfig/scripts/python/devops.py +8 -6
  6. machineconfig/scripts/python/devops_helpers/cli_config.py +10 -10
  7. machineconfig/scripts/python/devops_helpers/cli_nw.py +5 -5
  8. machineconfig/scripts/python/devops_helpers/cli_repos.py +20 -20
  9. machineconfig/scripts/python/devops_helpers/cli_self.py +6 -6
  10. machineconfig/scripts/python/devops_helpers/cli_share_server.py +6 -11
  11. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +8 -8
  12. machineconfig/scripts/python/helpers_repos/grource.py +1 -1
  13. machineconfig/scripts/python/helpers_repos/secure_repo.py +6 -6
  14. machineconfig/scripts/python/interactive.py +2 -2
  15. machineconfig/scripts/python/nw/add_ssh_key.py +5 -5
  16. machineconfig/scripts/python/nw/devops_add_ssh_key.py +5 -5
  17. machineconfig/scripts/python/nw/mount_nfs +1 -1
  18. machineconfig/scripts/python/repos_helpers/count_lines.py +4 -4
  19. machineconfig/scripts/python/repos_helpers/count_lines_frontend.py +3 -2
  20. machineconfig/scripts/python/sessions.py +15 -15
  21. machineconfig/scripts/python/sessions_helpers/sessions_multiprocess.py +4 -4
  22. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +1 -1
  23. machineconfig/settings/shells/bash/init.sh +3 -3
  24. machineconfig/settings/shells/pwsh/init.ps1 +1 -1
  25. machineconfig/setup_linux/web_shortcuts/interactive.sh +1 -1
  26. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +1 -1
  27. machineconfig/utils/installer_utils/installer.py +5 -5
  28. machineconfig/utils/ssh.py +1 -1
  29. {machineconfig-5.86.dist-info → machineconfig-5.88.dist-info}/METADATA +2 -2
  30. {machineconfig-5.86.dist-info → machineconfig-5.88.dist-info}/RECORD +33 -33
  31. {machineconfig-5.86.dist-info → machineconfig-5.88.dist-info}/WHEEL +0 -0
  32. {machineconfig-5.86.dist-info → machineconfig-5.88.dist-info}/entry_points.txt +0 -0
  33. {machineconfig-5.86.dist-info → machineconfig-5.88.dist-info}/top_level.txt +0 -0
@@ -245,14 +245,14 @@
245
245
  "doc": "🔗 Easy file sharing tool",
246
246
  "fileNamePattern": {
247
247
  "amd64": {
248
- "linux": "npm install -g ezshare",
249
- "windows": "npm install -g ezshare",
250
- "macos": "npm install -g ezshare"
248
+ "linux": "npm i -g @ezshare/cli",
249
+ "windows": "npm i -g @ezshare/cli",
250
+ "macos": "npm i -g @ezshare/cli"
251
251
  },
252
252
  "arm64": {
253
- "linux": "npm install -g ezshare",
254
- "windows": "npm install -g ezshare",
255
- "macos": "npm install -g ezshare"
253
+ "linux": "npm i -g @ezshare/cli",
254
+ "windows": "npm i -g @ezshare/cli",
255
+ "macos": "npm i -g @ezshare/cli"
256
256
  }
257
257
  }
258
258
  },
@@ -1,12 +1,12 @@
1
1
 
2
2
  import typer
3
- from typing import Optional, Literal
3
+ from typing import Optional, Literal, Annotated
4
4
 
5
5
 
6
- def main_public_from_parser(method: Literal["symlink", "copy"] = typer.Option(..., help="Method to use for setting up the config file."),
7
- on_conflict: Literal["throwError", "overwriteDefaultPath", "backupDefaultPath"] = typer.Option(..., help="Action to take on conflict"),
8
- which: Optional[str] = typer.Option(None, help="Specific items to process"),
9
- interactive: bool = typer.Option(False, help="Run in interactive mode")):
6
+ def main_public_from_parser(method: Annotated[Literal["symlink", "copy"], typer.Option(..., help="Method to use for setting up the config file.")],
7
+ on_conflict: Annotated[Literal["throwError", "overwriteDefaultPath", "backupDefaultPath"], typer.Option(..., help="Action to take on conflict")],
8
+ which: Annotated[Optional[str], typer.Option(..., help="Specific items to process")] = None,
9
+ interactive: Annotated[bool, typer.Option(..., help="Run in interactive mode")] = False):
10
10
  """Terminology:
11
11
  SOURCE = Self-Managed-Config-File-Path
12
12
  TARGET = Config-File-Default-Path
@@ -31,10 +31,10 @@ def main_public_from_parser(method: Literal["symlink", "copy"] = typer.Option(..
31
31
  apply_mapper(mapper_data=items_objections, on_conflict=on_conflict, method=method)
32
32
 
33
33
 
34
- def main_private_from_parser(method: Literal["symlink", "copy"] = typer.Option(..., help="Method to use for linking files"),
35
- on_conflict: Literal["throwError", "overwriteSelfManaged", "backupSelfManaged", "overwriteDefaultPath", "backupDefaultPath"] = typer.Option("throwError", help="Action to take on conflict"),
36
- which: Optional[str] = typer.Option(None, help="Specific items to process"),
37
- interactive: bool = typer.Option(False, help="Run in interactive mode")):
34
+ def main_private_from_parser(method: Annotated[Literal["symlink", "copy"], typer.Option(..., help="Method to use for linking files")],
35
+ on_conflict: Annotated[Literal["throwError", "overwriteSelfManaged", "backupSelfManaged", "overwriteDefaultPath", "backupDefaultPath"], typer.Option(..., help="Action to take on conflict")] = "throwError",
36
+ which: Annotated[Optional[str], typer.Option(..., help="Specific items to process")] = None,
37
+ interactive: Annotated[bool, typer.Option(..., help="Run in interactive mode")] = False):
38
38
  from machineconfig.profile.create_links import ConfigMapper, read_mapper
39
39
 
40
40
  mapper_full = read_mapper()["private"]
@@ -3,25 +3,25 @@
3
3
  """
4
4
 
5
5
  from pathlib import Path
6
- from typing import cast, Optional, get_args
6
+ from typing import cast, Optional, get_args, Annotated
7
7
  import typer
8
8
  from machineconfig.scripts.python.helpers_fire.fire_agents_helper_types import AGENTS, HOST, MODEL, PROVIDER
9
9
 
10
10
 
11
11
  def create(
12
- agent: AGENTS = typer.Option(..., "--agents", "-a", help=f"Agent type. One of {', '.join(get_args(AGENTS)[:3])}"),
13
- host: HOST = typer.Option(..., "--host", "-h", help=f"Machine to run agents on. One of {', '.join(get_args(HOST))}"),
14
- model: MODEL = typer.Option(..., "--model", "-m", help=f"Model to use (for crush agent). One of {', '.join(get_args(MODEL)[:3])}"),
15
- provider: PROVIDER = typer.Option(..., "--provider", "-p", help=f"Provider to use (for crush agent). One of {', '.join(get_args(PROVIDER)[:3])}"),
16
- context_path: Optional[Path] = typer.Option(None, "--context-path", "-c", help="Path to the context file/folder, defaults to .ai/todo/"),
17
- separator: str = typer.Option("\n", "--separator", "-s", help="Separator for context"),
18
- agent_load: int = typer.Option(13, "--agent-load", "-al", help="Number of tasks per prompt"),
19
- prompt: Optional[str] = typer.Option(None, "--prompt", "-P", help="Prompt prefix as string"),
20
- prompt_path: Optional[Path] = typer.Option(None, "--prompt-path", "-pp", help="Path to prompt file"),
21
- job_name: str = typer.Option("AI_Agents", "--job-name", "-j", help="Job name"),
22
- separate: bool = typer.Option(True, "--separate", "-S", help="Keep prompt material in separate file to the context."),
23
- output_path: Optional[Path] = typer.Option(None, "--output-path", "-o", help="Path to write the layout.json file"),
24
- agents_dir: Optional[Path] = typer.Option(None, "--agents-dir", "-ad", help="Directory to store agent files. If not provided, will be constructed automatically."),
12
+ agent: Annotated[AGENTS, typer.Option(..., "--agents", "-a", help=f"Agent type. One of {', '.join(get_args(AGENTS)[:3])}")],
13
+ host: Annotated[HOST, typer.Option(..., "--host", "-h", help=f"Machine to run agents on. One of {', '.join(get_args(HOST))}")],
14
+ model: Annotated[MODEL, typer.Option(..., "--model", "-m", help=f"Model to use (for crush agent). One of {', '.join(get_args(MODEL)[:3])}")],
15
+ provider: Annotated[PROVIDER, typer.Option(..., "--provider", "-p", help=f"Provider to use (for crush agent). One of {', '.join(get_args(PROVIDER)[:3])}")],
16
+ context_path: Annotated[Optional[Path], typer.Option(..., "--context-path", "-c", help="Path to the context file/folder, defaults to .ai/todo/")] = None,
17
+ separator: Annotated[str, typer.Option(..., "--separator", "-s", help="Separator for context")] = "\n",
18
+ agent_load: Annotated[int, typer.Option(..., "--agent-load", "-al", help="Number of tasks per prompt")] = 13,
19
+ prompt: Annotated[Optional[str], typer.Option(..., "--prompt", "-P", help="Prompt prefix as string")] = None,
20
+ prompt_path: Annotated[Optional[Path], typer.Option(..., "--prompt-path", "-pp", help="Path to prompt file")] = None,
21
+ job_name: Annotated[str, typer.Option(..., "--job-name", "-j", help="Job name")] = "AI_Agents",
22
+ separate: Annotated[bool, typer.Option(..., "--separate", "-S", help="Keep prompt material in separate file to the context.")] = True,
23
+ output_path: Annotated[Optional[Path], typer.Option(..., "--output-path", "-o", help="Path to write the layout.json file")] = None,
24
+ agents_dir: Annotated[Optional[Path], typer.Option(..., "--agents-dir", "-ad", help="Directory to store agent files. If not provided, will be constructed automatically.")] = None,
25
25
  ):
26
26
 
27
27
  from machineconfig.scripts.python.helpers_fire.fire_agents_help_launch import prep_agent_launch, get_agents_launch_layout
@@ -94,9 +94,9 @@ agents create "{context_path_resolved}" \\
94
94
 
95
95
 
96
96
  def collect(
97
- agent_dir: str = typer.Argument(..., help="Path to the agent directory containing the prompts folder"),
98
- output_path: str = typer.Argument(..., help="Path to write the concatenated material files"),
99
- separator: str = typer.Option("\n", help="Separator to use when concatenating material files"),
97
+ agent_dir: Annotated[str, typer.Argument(..., help="Path to the agent directory containing the prompts folder")],
98
+ output_path: Annotated[str, typer.Argument(..., help="Path to write the concatenated material files")],
99
+ separator: Annotated[str, typer.Option(..., help="Separator to use when concatenating material files")] = "\n",
100
100
  ) -> None:
101
101
  """Collect all material files from an agent directory and concatenate them."""
102
102
  if not Path(agent_dir).exists() or not Path(agent_dir).is_dir():
@@ -149,7 +149,7 @@ from pathlib import Path
149
149
  else:
150
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"))
151
151
  return
152
- else: ve_line = """--with "machineconfig[plot]>=5.84" """
152
+ else: ve_line = """--with "machineconfig[plot]>=5.87" """
153
153
  fire_line = f"uv run --python 3.14 {ve_line} {interpreter} {interactivity} {profile} {str(pyfile)}"
154
154
 
155
155
  from machineconfig.utils.code import run_shell_script
@@ -1,7 +1,7 @@
1
1
  """devops with emojis"""
2
2
 
3
3
  import typer
4
- from typing import Optional
4
+ from typing import Optional, Annotated
5
5
 
6
6
  import machineconfig.scripts.python.devops_helpers.cli_repos as cli_repos
7
7
  import machineconfig.scripts.python.devops_helpers.cli_config as cli_config
@@ -10,15 +10,17 @@ import machineconfig.scripts.python.devops_helpers.cli_data as cli_data
10
10
  import machineconfig.scripts.python.devops_helpers.cli_nw as cli_network
11
11
 
12
12
 
13
- def get_app():
14
- app = typer.Typer(help="🛠️ DevOps operations", no_args_is_help=True, add_completion=True)
15
- def install(which: Optional[str] = typer.Argument(None, help="Comma-separated list of program names to install, or group name if --group flag is set."),
16
- group: bool = typer.Option(False, "--group", "-g", help="Treat 'which' as a group name. A group is bundle of apps."),
17
- interactive: bool = typer.Option(False, "--interactive", "-ia", help="Interactive selection of programs to install."),
13
+ def install(which: Annotated[Optional[str], typer.Argument(..., help="Comma-separated list of program names to install, or group name if --group flag is set.")],
14
+ group: Annotated[bool, typer.Option(..., "--group", "-g", help="Treat 'which' as a group name. A group is bundle of apps.")] = False,
15
+ interactive: Annotated[bool, typer.Option(..., "--interactive", "-ia", help="Interactive selection of programs to install.")] = False,
18
16
  ) -> None:
19
17
  """📦 Install essential packages"""
20
18
  import machineconfig.utils.installer_utils.installer as installer_entry_point
21
19
  installer_entry_point.main(which=which, group=group, interactive=interactive)
20
+
21
+
22
+ def get_app():
23
+ app = typer.Typer(help="🛠️ DevOps operations", no_args_is_help=True, add_completion=True)
22
24
  _ = install
23
25
  app.command("install", no_args_is_help=True, help="🛠️ [i] Install essential packages")(install)
24
26
  app.command("i", no_args_is_help=True, help="Install essential packages", hidden=True)(install)
@@ -6,18 +6,18 @@ import typer
6
6
 
7
7
 
8
8
 
9
- def private(method: Literal["symlink", "copy"] = typer.Option(..., "--method", "-m", help="Method to use for linking files"),
10
- on_conflict: Literal["throwError", "overwriteSelfManaged", "backupSelfManaged", "overwriteDefaultPath", "backupDefaultPath"] = typer.Option("throwError", "--on-conflict", "-o", help="Action to take on conflict"),
11
- which: Optional[str] = typer.Option(None, "--which", "-w", help="Specific items to process"),
12
- interactive: bool = typer.Option(False, "--interactive", "-ia", help="Run in interactive mode")):
9
+ def private(method: Annotated[Literal["symlink", "copy"], typer.Option(..., "--method", "-m", help="Method to use for linking files")],
10
+ on_conflict: Annotated[Literal["throwError", "overwriteSelfManaged", "backupSelfManaged", "overwriteDefaultPath", "backupDefaultPath"], typer.Option(..., "--on-conflict", "-o", help="Action to take on conflict")] = "throwError",
11
+ which: Annotated[Optional[str], typer.Option(..., "--which", "-w", help="Specific items to process")] = None,
12
+ interactive: Annotated[bool, typer.Option(..., "--interactive", "-ia", help="Run in interactive mode")] = False):
13
13
  """🔗 Manage private configuration files."""
14
14
  import machineconfig.profile.create_links_export as create_links_export
15
15
  create_links_export.main_private_from_parser(method=method, on_conflict=on_conflict, which=which, interactive=interactive)
16
16
 
17
- def public(method: Literal["symlink", "copy"] = typer.Option(..., "--method", "-m", help="Method to use for setting up the config file."),
18
- on_conflict: Literal["throwError", "overwriteDefaultPath", "backupDefaultPath"] = typer.Option("throwError", "--on-conflict", "-o", help="Action to take on conflict"),
19
- which: Optional[str] = typer.Option(None, "--which", "-w", help="Specific items to process"),
20
- interactive: bool = typer.Option(False, "--interactive", "-ia", help="Run in interactive mode")):
17
+ def public(method: Annotated[Literal["symlink", "copy"], typer.Option(..., "--method", "-m", help="Method to use for setting up the config file.")],
18
+ on_conflict: Annotated[Literal["throwError", "overwriteDefaultPath", "backupDefaultPath"], typer.Option(..., "--on-conflict", "-o", help="Action to take on conflict")] = "throwError",
19
+ which: Annotated[Optional[str], typer.Option(..., "--which", "-w", help="Specific items to process")] = None,
20
+ interactive: Annotated[bool, typer.Option(..., "--interactive", "-ia", help="Run in interactive mode")] = False):
21
21
  """🔗 Manage public configuration files."""
22
22
  import machineconfig.profile.create_links_export as create_links_export
23
23
  create_links_export.main_public_from_parser(method=method, on_conflict=on_conflict, which=which, interactive=interactive)
@@ -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.84,textual" {path}""")
45
+ run_shell_script(f"""uv run --with "machineconfig>=5.87,textual" {path}""")
46
46
 
47
47
  def pwsh_theme():
48
48
  """🔗 Select powershell prompt theme."""
@@ -51,7 +51,7 @@ def pwsh_theme():
51
51
  import subprocess
52
52
  subprocess.run(["pwsh", "-File", str(file)])
53
53
 
54
- def copy_assets(which: Literal["scripts", "settings", "both"] = typer.Argument(..., help="Which assets to copy")):
54
+ def copy_assets(which: Annotated[Literal["scripts", "settings", "both"], typer.Argument(..., help="Which assets to copy")]):
55
55
  """🔗 Copy asset files from library to machine."""
56
56
  import machineconfig.profile.create_helper as create_helper
57
57
  match which:
@@ -2,7 +2,7 @@
2
2
  import machineconfig.scripts.python.devops_helpers.cli_terminal as cli_terminal
3
3
  import machineconfig.scripts.python.devops_helpers.cli_share_server as cli_share_server
4
4
  import typer
5
- from typing import Optional
5
+ from typing import Optional, Annotated
6
6
 
7
7
 
8
8
 
@@ -19,10 +19,10 @@ def install_ssh_server():
19
19
  run_shell_script(script=SSH_SERVER.read_text(encoding="utf-8"))
20
20
 
21
21
 
22
- def add_ssh_key(path: Optional[str] = typer.Option(None, help="Path to the public key file"),
23
- choose: bool = typer.Option(False, "--choose", "-c", help="Choose from available public keys in ~/.ssh/*.pub"),
24
- value: bool = typer.Option(False, "--value", "-v", help="Paste the public key content manually"),
25
- github: Optional[str] = typer.Option(None, "--github", "-g", help="Fetch public keys from a GitHub username")
22
+ def add_ssh_key(path: Annotated[Optional[str], typer.Option(..., help="Path to the public key file")] = None,
23
+ choose: Annotated[bool, typer.Option(..., "--choose", "-c", help="Choose from available public keys in ~/.ssh/*.pub")] = False,
24
+ value: Annotated[bool, typer.Option(..., "--value", "-v", help="Paste the public key content manually")] = False,
25
+ github: Annotated[Optional[str], typer.Option(..., "--github", "-g", help="Fetch public keys from a GitHub username")] = None
26
26
  ):
27
27
  """🔑 SSH add pub key to this machine so its accessible by owner of corresponding private key."""
28
28
  import machineconfig.scripts.python.nw.devops_add_ssh_key as helper
@@ -87,26 +87,26 @@ def analyze(directory: DirectoryArgument = None) -> None:
87
87
 
88
88
 
89
89
  def viz(
90
- repo: str = typer.Option(Path.cwd().__str__(), "--repo", "-r", help="Path to git repository to visualize"),
91
- output_file: Optional[Path] = typer.Option(None, "--output", "-o", help="Output video file (e.g., output.mp4). If specified, gource will render to video."),
92
- resolution: str = typer.Option("1920x1080", "--resolution", "-res", help="Video resolution (e.g., 1920x1080, 1280x720)"),
93
- seconds_per_day: float = typer.Option(0.1, "--seconds-per-day", "-spd", help="Speed of simulation (lower = faster)"),
94
- auto_skip_seconds: float = typer.Option(1.0, "--auto-skip-seconds", "-as", help="Skip to next entry if nothing happens for X seconds"),
95
- title: Optional[str] = typer.Option(None, "--title", "-t", help="Title for the visualization"),
96
- hide_items: list[str] = typer.Option([], "--hide", "-h", help="Items to hide: bloom, date, dirnames, files, filenames, mouse, progress, root, tree, users, usernames"),
97
- key_items: bool = typer.Option(False, "--key", "-k", help="Show file extension key"),
98
- fullscreen: bool = typer.Option(False, "--fullscreen", "-f", help="Run in fullscreen mode"),
99
- viewport: Optional[str] = typer.Option(None, "--viewport", "-v", help="Camera viewport (e.g., '1000x1000')"),
100
- start_date: Optional[str] = typer.Option(None, "--start-date", help="Start date (YYYY-MM-DD)"),
101
- stop_date: Optional[str] = typer.Option(None, "--stop-date", help="Stop date (YYYY-MM-DD)"),
102
- user_image_dir: Optional[Path] = typer.Option(None, "--user-image-dir", help="Directory with user avatar images"),
103
- max_files: int = typer.Option(0, "--max-files", help="Maximum number of files to show (0 = no limit)"),
104
- max_file_lag: float = typer.Option(5.0, "--max-file-lag", help="Max time files remain on screen after last change"),
105
- file_idle_time: int = typer.Option(0, "--file-idle-time", help="Time in seconds files remain idle before being removed"),
106
- framerate: int = typer.Option(60, "--framerate", help="Frames per second for video output"),
107
- background_color: str = typer.Option("000000", "--background-color", help="Background color in hex (e.g., 000000 for black)"),
108
- font_size: int = typer.Option(22, "--font-size", help="Font size"),
109
- camera_mode: str = typer.Option("overview", "--camera-mode", help="Camera mode: overview or track"),
90
+ repo: Annotated[str, typer.Option(..., "--repo", "-r", help="Path to git repository to visualize")] = Path.cwd().__str__(),
91
+ output_file: Annotated[Optional[Path], typer.Option(..., "--output", "-o", help="Output video file (e.g., output.mp4). If specified, gource will render to video.")] = None,
92
+ resolution: Annotated[str, typer.Option(..., "--resolution", "-res", help="Video resolution (e.g., 1920x1080, 1280x720)")] = "1920x1080",
93
+ seconds_per_day: Annotated[float, typer.Option(..., "--seconds-per-day", "-spd", help="Speed of simulation (lower = faster)")] = 0.1,
94
+ auto_skip_seconds: Annotated[float, typer.Option(..., "--auto-skip-seconds", "-as", help="Skip to next entry if nothing happens for X seconds")] = 1.0,
95
+ title: Annotated[Optional[str], typer.Option(..., "--title", "-t", help="Title for the visualization")] = None,
96
+ hide_items: Annotated[list[str], typer.Option(..., "--hide", "-h", help="Items to hide: bloom, date, dirnames, files, filenames, mouse, progress, root, tree, users, usernames")] = [],
97
+ key_items: Annotated[bool, typer.Option(..., "--key", "-k", help="Show file extension key")] = False,
98
+ fullscreen: Annotated[bool, typer.Option(..., "--fullscreen", "-f", help="Run in fullscreen mode")] = False,
99
+ viewport: Annotated[Optional[str], typer.Option(..., "--viewport", "-v", help="Camera viewport (e.g., '1000x1000')")] = None,
100
+ start_date: Annotated[Optional[str], typer.Option(..., "--start-date", help="Start date (YYYY-MM-DD)")] = None,
101
+ stop_date: Annotated[Optional[str], typer.Option(..., "--stop-date", help="Stop date (YYYY-MM-DD)")] = None,
102
+ user_image_dir: Annotated[Optional[Path], typer.Option(..., "--user-image-dir", help="Directory with user avatar images")] = None,
103
+ max_files: Annotated[int, typer.Option(..., "--max-files", help="Maximum number of files to show (0 = no limit)")] = 0,
104
+ max_file_lag: Annotated[float, typer.Option(..., "--max-file-lag", help="Max time files remain on screen after last change")] = 5.0,
105
+ file_idle_time: Annotated[int, typer.Option(..., "--file-idle-time", help="Time in seconds files remain idle before being removed")] = 0,
106
+ framerate: Annotated[int, typer.Option(..., "--framerate", help="Frames per second for video output")] = 60,
107
+ background_color: Annotated[str, typer.Option(..., "--background-color", help="Background color in hex (e.g., 000000 for black)")] = "000000",
108
+ font_size: Annotated[int, typer.Option(..., "--font-size", help="Font size")] = 22,
109
+ camera_mode: Annotated[str, typer.Option(..., "--camera-mode", help="Camera mode: overview or track")] = "overview",
110
110
  ) -> None:
111
111
  """🎬 Visualize repository activity using Gource."""
112
112
  from machineconfig.scripts.python.helpers_repos.grource import visualize
@@ -1,6 +1,6 @@
1
1
 
2
2
  import typer
3
- from typing import Optional
3
+ from typing import Optional, Annotated
4
4
 
5
5
 
6
6
  def update():
@@ -41,9 +41,9 @@ def install():
41
41
  # main_public_from_parser()
42
42
  import platform
43
43
  if platform.system() == "Windows":
44
- run_shell_script(r"""$HOME\.local\bin\uv.exe tool install machineconfig>=5.84""")
44
+ run_shell_script(r"""$HOME\.local\bin\uv.exe tool install machineconfig>=5.87""")
45
45
  else:
46
- run_shell_script("""$HOME/.local/bin/uv tool install machineconfig>=5.84""")
46
+ run_shell_script("""$HOME/.local/bin/uv tool install machineconfig>=5.87""")
47
47
 
48
48
  def navigate():
49
49
  """📚 NAVIGATE command structure with TUI"""
@@ -51,11 +51,11 @@ def navigate():
51
51
  from pathlib import Path
52
52
  path = Path(navigator.__file__).resolve().parent.joinpath("devops_navigator.py")
53
53
  from machineconfig.utils.code import run_shell_script
54
- run_shell_script(f"""uv run --with "machineconfig>=5.84,textual" {path}""")
54
+ run_shell_script(f"""uv run --with "machineconfig>=5.87,textual" {path}""")
55
55
 
56
56
 
57
- def run_python(ip: str = typer.Argument(..., help="Python command to run in the machineconfig environment"),
58
- command: Optional[bool] = typer.Option(False, "--command", "-c", help="Run as command")):
57
+ def run_python(ip: Annotated[str, typer.Argument(..., help="Python command to run in the machineconfig environment")],
58
+ command: Annotated[Optional[bool], typer.Option(..., "--command", "-c", help="Run as command")] = False):
59
59
  """🐍 RUN python command/file in the machineconfig environment"""
60
60
  if command:
61
61
  exec(ip)
@@ -1,19 +1,15 @@
1
1
  from pathlib import Path
2
2
  from typing import Optional, Annotated
3
3
  import typer
4
- # import typer
5
-
6
4
 
7
5
 
8
6
  def display_share_url(local_ip_v4: str, port: int, protocol: str = "http") -> None:
9
7
  """Display a flashy, unmissable share URL announcement."""
10
-
11
8
  from rich.console import Console
12
9
  from rich.panel import Panel
13
10
  from rich.text import Text
14
11
  from rich.align import Align
15
12
  console = Console()
16
-
17
13
  # Create the main message with styling
18
14
  url_text = Text(f"{protocol}://{local_ip_v4}:{port}", style="bold bright_cyan underline")
19
15
  message = Text.assemble(
@@ -22,7 +18,6 @@ def display_share_url(local_ip_v4: str, port: int, protocol: str = "http") -> No
22
18
  url_text,
23
19
  (" 🚀", "bright_red")
24
20
  )
25
-
26
21
  # Create a fancy panel with borders and styling
27
22
  panel = Panel(
28
23
  Align.center(message),
@@ -32,7 +27,6 @@ def display_share_url(local_ip_v4: str, port: int, protocol: str = "http") -> No
32
27
  padding=(1, 2),
33
28
  expand=False
34
29
  )
35
-
36
30
  # Print with extra spacing and attention-grabbing elements
37
31
  console.print(panel)
38
32
 
@@ -45,9 +39,8 @@ def main(
45
39
  over_internet: Annotated[bool, typer.Option("--over-internet", "-i", help="Expose the share server over the internet using ngrok")] = False
46
40
  ) -> None:
47
41
  from machineconfig.utils.installer_utils.installer import install_if_missing
48
- install_if_missing("ezshare")
49
- if over_internet: install_if_missing("ngrok")
50
-
42
+ install_if_missing(which="easy-sharing")
43
+ if over_internet: install_if_missing(which="ngrok", )
51
44
  if username is None:
52
45
  import getpass
53
46
  username = getpass.getuser()
@@ -56,7 +49,9 @@ def main(
56
49
  if pwd_path.exists():
57
50
  password = pwd_path.read_text(encoding="utf-8").strip()
58
51
  else:
59
- raise ValueError("Password not provided and default password file does not exist.")
52
+ # raise ValueError("Password not provided and default password file does not exist.")
53
+ typer.echo(f"⚠️ WARNING: Password not provided and default password file does not exist.\nPath: {pwd_path}\nUsing default password: 'quick_password' (insecure!)", err=True)
54
+ typer.Exit(code=1)
60
55
 
61
56
  if port is None:
62
57
  port = 8080 # Default port for ezshare
@@ -73,7 +68,7 @@ def main(
73
68
  import subprocess
74
69
  import time
75
70
  # Build ezshare command
76
- ezshare_cmd = f"ezshare --port {port} --username {username} --password {password} {path}"
71
+ ezshare_cmd = f"""easy-sharing --port {port} --username {username} --password "{password}" {path}"""
77
72
  ezshare_process = subprocess.Popen(ezshare_cmd, shell=True)
78
73
  processes = [ezshare_process]
79
74
 
@@ -10,18 +10,18 @@ from machineconfig.utils.code import get_shell_file_executing_python_script, wri
10
10
 
11
11
  import platform
12
12
  import subprocess
13
- from typing import Optional, Literal
13
+ from typing import Optional, Literal, Annotated
14
14
 
15
15
 
16
16
  console = Console()
17
17
 
18
18
 
19
19
  def main(
20
- cloud: Optional[str] = typer.Option(None, "--cloud", "-c", help="Cloud storage profile name. If not provided, uses default from config."),
21
- repo: Optional[str] = typer.Option(None, "--repo", "-r", help="Path to the local repository. Defaults to current working directory."),
22
- message: Optional[str] = typer.Option(None, "--message", "-m", help="Commit message for local changes."),
23
- on_conflict: Literal["ask", "push-local-merge", "overwrite-local", "stop-on-conflict", "remove-rclone-conflict"] = typer.Option("ask", "--on-conflict", "-oc", help="Action to take on merge conflict. Default is 'ask'."),
24
- pwd: Optional[str] = typer.Option(None, "--password", help="Password for encryption/decryption of the remote repository."),
20
+ cloud: Annotated[Optional[str], typer.Option(..., "--cloud", "-c", help="Cloud storage profile name. If not provided, uses default from config.")] = None,
21
+ repo: Annotated[Optional[str], typer.Option(..., "--repo", "-r", help="Path to the local repository. Defaults to current working directory.")] = None,
22
+ message: Annotated[Optional[str], typer.Option(..., "--message", "-m", help="Commit message for local changes.")] = None,
23
+ on_conflict: Annotated[Literal["ask", "push-local-merge", "overwrite-local", "stop-on-conflict", "remove-rclone-conflict"], typer.Option(..., "--on-conflict", "-oc", help="Action to take on merge conflict. Default is 'ask'.")] = "ask",
24
+ pwd: Annotated[Optional[str], typer.Option(..., "--password", help="Password for encryption/decryption of the remote repository.")] = None,
25
25
  ):
26
26
  if cloud is None:
27
27
  try:
@@ -101,7 +101,7 @@ git pull originEnc master
101
101
  return "done"
102
102
  from machineconfig.utils.meta import function_to_script
103
103
  program_1_py = function_to_script(func=func2, call_with_args=None, call_with_kwargs={"remote_repo": str(repo_remote_root), "local_repo": str(repo_local_root), "cloud": cloud_resolved})
104
- shell_file_1 = get_shell_file_executing_python_script(python_script=program_1_py, ve_path=None, executable="""uv run --with "machineconfig>=5.84" """)
104
+ shell_file_1 = get_shell_file_executing_python_script(python_script=program_1_py, ve_path=None, executable="""uv run --with "machineconfig>=5.87" """)
105
105
  # ================================================================================
106
106
  option2 = "Delete local repo and replace it with remote copy:"
107
107
  program_2 = f"""
@@ -122,7 +122,7 @@ sudo chmod +x $HOME/dotfiles/scripts/linux -R
122
122
  inspect_repos(repo_local_root=repo_local_root, repo_remote_root=repo_remote_root)
123
123
  return "done"
124
124
  program_3_py = function_to_script(func=func, call_with_args=None, call_with_kwargs={"repo_local_root": str(repo_local_root), "repo_remote_root": str(repo_remote_root)})
125
- shell_file_3 = get_shell_file_executing_python_script(python_script=program_3_py, ve_path=None, executable="""uv run --with "machineconfig>=5.84" """)
125
+ shell_file_3 = get_shell_file_executing_python_script(python_script=program_3_py, ve_path=None, executable="""uv run --with "machineconfig>=5.87" """)
126
126
  # ================================================================================
127
127
 
128
128
  option4 = "Remove problematic rclone file from repo and replace with remote:"
@@ -319,7 +319,7 @@ def visualize(
319
319
 
320
320
 
321
321
  def install(
322
- version: Optional[str] = typer.Option("0.53", "--version", "-v", help="Gource version to install"),
322
+ version: Annotated[Optional[str], typer.Option(..., "--version", "-v", help="Gource version to install")] = "0.53",
323
323
  ) -> None:
324
324
  """Install portable Gource on Windows (no admin privileges required)."""
325
325
  if platform.system() == "Windows":
@@ -1,15 +1,15 @@
1
1
 
2
2
  import typer
3
- from typing import Optional, Literal
3
+ from typing import Optional, Literal, Annotated
4
4
  from pathlib import Path
5
5
 
6
6
 
7
7
  def main(
8
- cloud: Optional[str] = typer.Option(None, "--cloud", "-c", help="Cloud storage profile name. If not provided, uses default from config."),
9
- repo: Optional[str] = typer.Option(Path.cwd().as_posix(), "--repo", "-r", help="Path to the local repository. Defaults to cwd."),
10
- message: Optional[str] = typer.Option(None, "--message", "-m", help="Commit message for local changes."),
11
- on_conflict: Literal["ask", "push-local-merge", "overwrite-local", "stop-on-conflict", "remove-rclone-conflict"] = typer.Option("ask", "--on-conflict", "-oc", help="Action to take on merge conflict. Default is 'ask'."),
12
- pwd: Optional[str] = typer.Option(None, "--password", help="Password for encryption/decryption of the remote repository."),
8
+ cloud: Annotated[Optional[str], typer.Option(..., "--cloud", "-c", help="Cloud storage profile name. If not provided, uses default from config.")] = None,
9
+ repo: Annotated[Optional[str], typer.Option(..., "--repo", "-r", help="Path to the local repository. Defaults to cwd.")] = Path.cwd().as_posix(),
10
+ message: Annotated[Optional[str], typer.Option(..., "--message", "-m", help="Commit message for local changes.")] = None,
11
+ on_conflict: Annotated[Literal["ask", "push-local-merge", "overwrite-local", "stop-on-conflict", "remove-rclone-conflict"], typer.Option(..., "--on-conflict", "-oc", help="Action to take on merge conflict. Default is 'ask'.")] = "ask",
12
+ pwd: Annotated[Optional[str], typer.Option(..., "--password", help="Password for encryption/decryption of the remote repository.")] = None,
13
13
  ):
14
14
  from machineconfig.scripts.python.helpers_repos.cloud_repo_sync import main as program_content
15
15
  program_content(cloud=cloud, repo=repo, message=message, on_conflict=on_conflict, pwd=pwd)
@@ -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.84""")
133
+ run_shell_script(r"""$HOME\.local\bin\uv.exe tool install machineconfig>=5.87""")
134
134
  else:
135
- run_shell_script("""$HOME/.local/bin/uv tool install machineconfig>=5.84""")
135
+ run_shell_script("""$HOME/.local/bin/uv tool install machineconfig>=5.87""")
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
@@ -6,7 +6,7 @@ from machineconfig.utils.path_extended import PathExtended
6
6
  from rich.console import Console
7
7
  from rich.panel import Panel
8
8
  from rich import box # Import box
9
- from typing import Optional
9
+ from typing import Optional, Annotated
10
10
  import typer
11
11
 
12
12
 
@@ -77,10 +77,10 @@ sudo service ssh --full-restart
77
77
  """
78
78
 
79
79
 
80
- def main(pub_path: Optional[str] = typer.Argument(None, help="Path to the public key file"),
81
- pub_choose: bool = typer.Option(False, "--choose", "-c", help="Choose from available public keys in ~/.ssh"),
82
- pub_val: bool = typer.Option(False, "--paste", "-p", help="Paste the public key content manually"),
83
- from_github: Optional[str] = typer.Option(None, "--from-github", "-g", help="Fetch public keys from a GitHub username")
80
+ def main(pub_path: Annotated[Optional[str], typer.Argument(..., help="Path to the public key file")] = None,
81
+ pub_choose: Annotated[bool, typer.Option(..., "--choose", "-c", help="Choose from available public keys in ~/.ssh")] = False,
82
+ pub_val: Annotated[bool, typer.Option(..., "--paste", "-p", help="Paste the public key content manually")] = False,
83
+ from_github: Annotated[Optional[str], typer.Option(..., "--from-github", "-g", help="Fetch public keys from a GitHub username")] = None
84
84
  ) -> None:
85
85
  if pub_path:
86
86
  key_path = PathExtended(pub_path).expanduser().absolute()
@@ -6,7 +6,7 @@ from machineconfig.utils.path_extended import PathExtended
6
6
  from rich.console import Console
7
7
  from rich.panel import Panel
8
8
  from rich import box
9
- from typing import Optional
9
+ from typing import Optional, Annotated
10
10
  import typer
11
11
 
12
12
 
@@ -66,10 +66,10 @@ sudo service ssh --full-restart
66
66
  return program
67
67
 
68
68
 
69
- def main(pub_path: Optional[str] = typer.Argument(None, help="Path to the public key file"),
70
- pub_choose: bool = typer.Option(False, "--choose", "-c", help="Choose from available public keys in ~/.ssh"),
71
- pub_val: bool = typer.Option(False, "--paste", "-p", help="Paste the public key content manually"),
72
- from_github: Optional[str] = typer.Option(None, "--from-github", "-g", help="Fetch public keys from a GitHub username")
69
+ def main(pub_path: Annotated[Optional[str], typer.Argument(..., help="Path to the public key file")] = None,
70
+ pub_choose: Annotated[bool, typer.Option(..., "--choose", "-c", help="Choose from available public keys in ~/.ssh")] = False,
71
+ pub_val: Annotated[bool, typer.Option(..., "--paste", "-p", help="Paste the public key content manually")] = False,
72
+ from_github: Annotated[Optional[str], typer.Option(..., "--from-github", "-g", help="Fetch public keys from a GitHub username")] = None
73
73
  ) -> None:
74
74
 
75
75
  if pub_path:
@@ -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.84" python -m machineconfig.scripts.python.mount_nfs
8
+ uv run --python 3.14 --with "machineconfig>=5.87" 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."
@@ -1,5 +1,5 @@
1
1
 
2
- from typing import TYPE_CHECKING
2
+ from typing import TYPE_CHECKING, Annotated
3
3
  from git import Repo
4
4
  from collections import defaultdict
5
5
  from datetime import datetime
@@ -82,7 +82,7 @@ def get_default_branch(repo: Repo) -> str:
82
82
 
83
83
 
84
84
  @app.command()
85
- def count_historical(repo_path: str = typer.Argument(..., help="Path to the git repository")):
85
+ def count_historical(repo_path: Annotated[str, typer.Argument(..., help="Path to the git repository")]):
86
86
  """Count total historical lines of Python code in the repository."""
87
87
  print(f"Analyzing repository: {repo_path}")
88
88
  total_loc: int = count_historical_loc(repo_path)
@@ -90,7 +90,7 @@ def count_historical(repo_path: str = typer.Argument(..., help="Path to the git
90
90
 
91
91
 
92
92
  @app.command()
93
- def analyze_over_time(repo_path: str = typer.Argument(..., help="Path to the git repository")):
93
+ def analyze_over_time(repo_path: Annotated[str, typer.Argument(..., help="Path to the git repository")]):
94
94
  """Analyze a git repository to track Python code size over time with visualization."""
95
95
  repo: Repo = Repo(repo_path)
96
96
  branch_name: str = get_default_branch(repo)
@@ -336,7 +336,7 @@ def _print_python_files_by_size_impl(repo_path: str) -> "Union[pl.DataFrame, Exc
336
336
 
337
337
 
338
338
  @app.command()
339
- def print_python_files_by_size(repo_path: str = typer.Argument(..., help="Path to the git repository")):
339
+ def print_python_files_by_size(repo_path: Annotated[str, typer.Argument(..., help="Path to the git repository")]):
340
340
  """Print Python files sorted by size with visualizations."""
341
341
  result = _print_python_files_by_size_impl(repo_path)
342
342
  if isinstance(result, Exception):
@@ -1,13 +1,14 @@
1
1
 
2
2
  import typer
3
+ from typing import Annotated
3
4
 
4
5
 
5
- def analyze_repo_development(repo_path: str = typer.Argument(..., help="Path to the git repository")):
6
+ def analyze_repo_development(repo_path: Annotated[str, typer.Argument(..., help="Path to the git repository")]):
6
7
  from machineconfig.scripts.python.repos_helpers import count_lines
7
8
  from pathlib import Path
8
9
  count_lines_path = Path(count_lines.__file__)
9
10
  # --project $HOME/code/ machineconfig --group plot
10
- cmd = f"""uv run --python 3.14 --with "machineconfig[plot]>=5.84" {count_lines_path} analyze-over-time {repo_path}"""
11
+ cmd = f"""uv run --python 3.14 --with "machineconfig[plot]>=5.87" {count_lines_path} analyze-over-time {repo_path}"""
11
12
  from machineconfig.utils.code import run_shell_script
12
13
  run_shell_script(cmd)
13
14
 
@@ -1,13 +1,13 @@
1
1
 
2
2
  from pathlib import Path
3
- from typing import Optional, Literal
3
+ from typing import Optional, Literal, Annotated
4
4
  import typer
5
5
 
6
- def balance_load(layout_path: Path = typer.Argument(..., help="Path to the layout.json file"),
7
- max_thresh: int = typer.Option(..., help="Maximum tabs per layout"),
8
- thresh_type: Literal['number', 'weight'] = typer.Option(..., help="Threshold type"),
9
- breaking_method: Literal['moreLayouts', 'combineTabs'] = typer.Option(..., help="Breaking method"),
10
- output_path: Optional[Path] = typer.Option(None, help="Path to write the adjusted layout.json file")):
6
+ def balance_load(layout_path: Annotated[Path, typer.Argument(..., help="Path to the layout.json file")],
7
+ max_thresh: Annotated[int, typer.Option(..., help="Maximum tabs per layout")],
8
+ thresh_type: Annotated[Literal['number', 'weight'], typer.Option(..., help="Threshold type")],
9
+ breaking_method: Annotated[Literal['moreLayouts', 'combineTabs'], typer.Option(..., help="Breaking method")],
10
+ output_path: Annotated[Optional[Path], typer.Option(..., help="Path to write the adjusted layout.json file")] = None):
11
11
  """Adjust layout file to limit max tabs per layout, etc."""
12
12
  from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile
13
13
  import json
@@ -69,15 +69,15 @@ def find_layout_file(layout_path: str, ) -> Path:
69
69
 
70
70
 
71
71
  def run(ctx: typer.Context,
72
- layout_path: Optional[str] = typer.Argument(None, help="Path to the layout.json file"),
73
- max_tabs: int = typer.Option(10, help="A Sanity checker that throws an error if any layout exceeds the maximum number of tabs to launch."),
74
- max_layouts: int = typer.Option(10, help="A Sanity checker that throws an error if the total number of layouts exceeds this number."),
75
- sleep_inbetween: float = typer.Option(1.0, help="Sleep time in seconds between launching layouts"),
76
- monitor: bool = typer.Option(False, "--monitor", "-m", help="Monitor the layout sessions for completion"),
77
- parallel: bool = typer.Option(False, "--parallel", "-p", help="Launch multiple layouts in parallel"),
78
- kill_upon_completion: bool = typer.Option(False, "--kill-upon-completion", "-k", help="Kill session(s) upon completion (only relevant if monitor flag is set)"),
79
- choose: Optional[str] = typer.Option(None, "--choose", "-c", help="Comma separated names of layouts to be selected from the layout file passed"),
80
- choose_interactively: bool = typer.Option(False, "--choose-interactively", "-ia", help="Select layouts interactively")
72
+ layout_path: Annotated[Optional[str], typer.Argument(..., help="Path to the layout.json file")] = None,
73
+ max_tabs: Annotated[int, typer.Option(..., help="A Sanity checker that throws an error if any layout exceeds the maximum number of tabs to launch.")] = 10,
74
+ max_layouts: Annotated[int, typer.Option(..., help="A Sanity checker that throws an error if the total number of layouts exceeds this number.")] = 10,
75
+ sleep_inbetween: Annotated[float, typer.Option(..., help="Sleep time in seconds between launching layouts")] = 1.0,
76
+ monitor: Annotated[bool, typer.Option(..., "--monitor", "-m", help="Monitor the layout sessions for completion")] = False,
77
+ parallel: Annotated[bool, typer.Option(..., "--parallel", "-p", help="Launch multiple layouts in parallel")] = False,
78
+ kill_upon_completion: Annotated[bool, typer.Option(..., "--kill-upon-completion", "-k", help="Kill session(s) upon completion (only relevant if monitor flag is set)")] = False,
79
+ choose: Annotated[Optional[str], typer.Option(..., "--choose", "-c", help="Comma separated names of layouts to be selected from the layout file passed")] = None,
80
+ choose_interactively: Annotated[bool, typer.Option(..., "--choose-interactively", "-ia", help="Select layouts interactively")] = False
81
81
  ):
82
82
  """
83
83
  Launch terminal sessions based on a layout configuration file.
@@ -1,14 +1,14 @@
1
1
 
2
2
 
3
- from typing import Optional
3
+ from typing import Optional, Annotated
4
4
  from pathlib import Path
5
5
  import typer
6
6
 
7
7
 
8
8
  def create_from_function(
9
- num_process: int = typer.Option(..., "--num-process", "-n", help="Number of parallel processes to run"),
10
- path: str = typer.Option(".", "--path", "-p", help="Path to a Python or Shell script file or a directory containing such files"),
11
- function: Optional[str] = typer.Option(None, "--function", "-f", help="Function to run from the Python file. If not provided, you will be prompted to choose."),
9
+ num_process: Annotated[int, typer.Option(..., "--num-process", "-n", help="Number of parallel processes to run")],
10
+ path: Annotated[str, typer.Option(..., "--path", "-p", help="Path to a Python or Shell script file or a directory containing such files")] = ".",
11
+ function: Annotated[Optional[str], typer.Option(..., "--function", "-f", help="Function to run from the Python file. If not provided, you will be prompted to choose.")] = None,
12
12
  ):
13
13
  from machineconfig.utils.ve import get_ve_activate_line, get_ve_path_and_ipython_profile
14
14
  from machineconfig.utils.options import choose_from_options
@@ -7,7 +7,7 @@ $user = ''
7
7
  $sharePath = ''
8
8
  $driveLetter = ''
9
9
 
10
- uv run --python 3.14 --with "machineconfig>=5.84" python -m machineconfig.scripts.python.mount_ssh
10
+ uv run --python 3.14 --with "machineconfig>=5.87" 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
@@ -16,12 +16,12 @@ add_to_path_if_not_already \
16
16
  "$HOME/.cargo/bin" \
17
17
  "$CONFIG_ROOT/scripts/linux" \
18
18
  "$HOME/dotfiles/scripts/linux" \
19
- "$HOME/.nix-profile/bin" \
20
- "/home/linuxbrew/.linuxbrew/bin" \
19
+
21
20
  "/usr/games"
22
21
  # this way, if the script was run multiple times, e.g. due to nested shells in zellij, there will be no duplicates in the path
23
22
  # export DISPLAY=localhost:0.0 # xming server
24
-
23
+ # "$HOME/.nix-profile/bin" \
24
+ # "/home/linuxbrew/.linuxbrew/bin" \
25
25
 
26
26
  # echo "Sourcing scripts ..."
27
27
  . $CONFIG_ROOT/settings/broot/br.sh
@@ -1,6 +1,6 @@
1
1
 
2
2
 
3
- $MAC_ROOT = "$HOME\code\machineconfig"
3
+ $MAC_ROOT = "$HOME\.config\machineconfig
4
4
 
5
5
  function Add-ToPathIfNotAlready {
6
6
  param (
@@ -1,7 +1,7 @@
1
1
  #!/bin/bash
2
2
  . <( curl -sSL "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/setup_linux/uv.sh")
3
3
  mcfg() {
4
- "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>="mcfg 5.84" mcfg "$@"
4
+ "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>=5.87" mcfg "$@"
5
5
  }
6
6
  alias d="mcfg devops"
7
7
  alias c="mcfg cloud"
@@ -2,7 +2,7 @@
2
2
 
3
3
  iex (iwr "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/setup_windows/uv.ps1").Content
4
4
  function mcfg {
5
- & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.84" mcfg $args
5
+ & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.87" mcfg $args
6
6
  }
7
7
  function d { mcfg devops @args }
8
8
  function c { mcfg cloud @args }
@@ -5,7 +5,7 @@ import typer
5
5
  from rich.console import Console
6
6
  from rich.panel import Panel
7
7
  from rich.table import Table
8
- from typing import Optional, cast, get_args
8
+ from typing import Optional, cast, get_args, Annotated
9
9
  from machineconfig.jobs.installer.package_groups import PACKAGE_GROUPS, PACKAGE_GROUP2NAMES
10
10
 
11
11
  console = Console()
@@ -56,9 +56,9 @@ def main_with_parser():
56
56
 
57
57
 
58
58
  def main(
59
- which: Optional[str] = typer.Argument(None, help="Comma-separated list of program/groups names to install (if --group flag is set)."),
60
- group: bool = typer.Option(False, "--group", "-g", help="Treat 'which' as a group name. A group is bundle of apps."),
61
- interactive: bool = typer.Option(False, "--interactive", "-ia", help="Interactive selection of programs to install."),
59
+ which: Annotated[Optional[str], typer.Argument(..., help="Comma-separated list of program/groups names to install (if --group flag is set).")] = None,
60
+ group: Annotated[bool, typer.Option(..., "--group", "-g", help="Treat 'which' as a group name. A group is bundle of apps.")] = False,
61
+ interactive: Annotated[bool, typer.Option(..., "--interactive", "-ia", help="Interactive selection of programs to install.")] = False,
62
62
  ) -> None:
63
63
  if interactive:
64
64
  return install_interactively()
@@ -189,7 +189,7 @@ def install_if_missing(which: str):
189
189
  return
190
190
  print(f"⏳ {which} not found. Installing...")
191
191
  from machineconfig.utils.installer_utils.installer import main
192
- main(which=which)
192
+ main(which=which, interactive=False)
193
193
 
194
194
 
195
195
  if __name__ == "__main__":
@@ -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.84"
9
+ MACHINECONFIG_VERSION = "machineconfig>=5.87"
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.86
3
+ Version: 5.88
4
4
  Summary: Dotfiles management package
5
5
  Author-email: Alex Al-Saffar <programmer@usa.com>
6
6
  License: Apache 2.0
@@ -69,7 +69,7 @@ iex (iwr bit.ly/cfgwindows).Content
69
69
 
70
70
  ```bash
71
71
 
72
- . <(curl -sL bit.ly/cfglinux)
72
+ . <(curl -L bit.ly/cfglinux)
73
73
  ```
74
74
 
75
75
 
@@ -46,7 +46,7 @@ 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=qkQi-ZkGqjPJspa30CpbHzHLEnjEO81bUDK0yFyoIFc,74978
49
+ machineconfig/jobs/installer/installer_data.json,sha256=JHpJIURGqdSxhE5SFyQ93-L7LxI6wpLDbqC9OCnQygI,74972
50
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
@@ -95,7 +95,7 @@ machineconfig/profile/backup.toml,sha256=Hb25sIdKVvLqOF62NgiOpGZxd45I6IhsNHu623R
95
95
  machineconfig/profile/bash_shell_profiles.md,sha256=mio0xkMTwO-F3fikWIfgcdQaPCmQrmkxJMNtZsTe9TI,514
96
96
  machineconfig/profile/create_helper.py,sha256=_iNeuwmcEGTx6sf_f40JKHfOCuJRZQRpyE8Fo_3Q6bI,1519
97
97
  machineconfig/profile/create_links.py,sha256=K7T2bq08GZP9fo2NzCOE0pojAgQDe0Ofe7fNfbQlQpw,14219
98
- machineconfig/profile/create_links_export.py,sha256=OEmuJE-F7FZX5xvOl1rqJzHg_BWtPKCiWdrq4RPOobs,3173
98
+ machineconfig/profile/create_links_export.py,sha256=6LW4ZzHhQaox6W-rAuw3_gENTVKmOXA8_JfVDA-Mfws,3294
99
99
  machineconfig/profile/create_shell_profile.py,sha256=ifsEAK90ovvY7ftyxuY5-Xh8f2JuQYX7IMYUXp6x2Sw,9538
100
100
  machineconfig/profile/mapper.toml,sha256=50q2VdR_PNLXGljH47R2cxuJvzlJQnq7lkJ05TMtJ5Q,12357
101
101
  machineconfig/profile/records/generic/shares.toml,sha256=FduDztfyQtZcr5bfx-RSKhEEweweQSWfVXkKWnx8hCY,143
@@ -119,16 +119,16 @@ machineconfig/scripts/linux/other/share_smb,sha256=HZX8BKgMlS9JzkGIYnxTsPvoxEBBu
119
119
  machineconfig/scripts/linux/other/start_docker,sha256=_yDN_PPqgzSUnPT7dmniMTpL4IfeeaGy1a2OL3IJlDU,525
120
120
  machineconfig/scripts/linux/other/switch_ip,sha256=NQfeKMBSbFY3eP6M-BadD-TQo5qMP96DTp77KHk2tU8,613
121
121
  machineconfig/scripts/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
- machineconfig/scripts/python/agents.py,sha256=DIfM7mqi8BhB7PWk-UiBNOYjUzQHdeA1hoS8v3FHKPQ,10446
122
+ machineconfig/scripts/python/agents.py,sha256=f5UxgXjGlEypoNFqK0uHKO0UkbV_wUmPiPzotL2yapM,10677
123
123
  machineconfig/scripts/python/cloud.py,sha256=ubLmf06FSdi1NawpQDgUDAtYb9cZSQqHbSUHzAwRIas,1199
124
- machineconfig/scripts/python/croshell.py,sha256=A4beywje-U2gyOcCCaXoqXP2nz47DShqNbikQWvCcH8,7083
125
- machineconfig/scripts/python/devops.py,sha256=9VgoOQLLOpCgJDu6j4PbydKCsjvmNoPriuVL35WT3HE,2102
124
+ machineconfig/scripts/python/croshell.py,sha256=0Ym3n-ZmIpaOX_SWnGP88dq_iH7QWJKUZvY0x58sXjI,7083
125
+ machineconfig/scripts/python/devops.py,sha256=VYxwtgwKVs9qMmBxTz2fagNnapizpAXEGlzR0iHp-rw,2152
126
126
  machineconfig/scripts/python/devops_navigator.py,sha256=4O9_-ACeP748NcMjWQXZF7mBQpMPxqCGhLvPG3DMi4Q,236
127
127
  machineconfig/scripts/python/entry.py,sha256=Az7dK1eXHGW5l46Yg10Cd88VChCdhvLAzO3e1A3r56A,2176
128
128
  machineconfig/scripts/python/fire_jobs.py,sha256=O5DrckUGLxGblOcLf_iXU31pmCSpTg-c0hQZxQKD1os,13591
129
129
  machineconfig/scripts/python/ftpx.py,sha256=UBDP6IIfWkaML1uZT1FrfGUUy_Of5LI82IdqEzo05_U,9760
130
- machineconfig/scripts/python/interactive.py,sha256=Vl7ZR4A5qRSFg7IHIky-i8J8DmGu-KzuvhL6pmkfCHY,11790
131
- machineconfig/scripts/python/sessions.py,sha256=Xaol7AzLItb3GIHo_sEVFUpFmTKDeTgqlK3-syqtNxw,9545
130
+ machineconfig/scripts/python/interactive.py,sha256=8HbT9OaZ3lhoIYghIkeE6bI5TZ0RPlL0LwEszK6oPNw,11790
131
+ machineconfig/scripts/python/sessions.py,sha256=CfXeEAABFigrYbzJgjsE5NX_Y7Lf3wji0PFmSxcYoQ8,9756
132
132
  machineconfig/scripts/python/ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
133
133
  machineconfig/scripts/python/ai/generate_files.py,sha256=VfjKdwgF8O6E4oiRtfWNliibLmmwGe7f9ld6wpOsXTw,14498
134
134
  machineconfig/scripts/python/ai/initai.py,sha256=9SZtWOcRuwk8ZU3wHOfPzjInERD79ZTYFY8tVACgza4,2260
@@ -173,13 +173,13 @@ machineconfig/scripts/python/croshell_helpers/start_slidev.py,sha256=HfJReOusTPh
173
173
  machineconfig/scripts/python/croshell_helpers/viewer.py,sha256=heQNjB9fwn3xxbPgMofhv1Lp6Vtkl76YjjexWWBM0pM,2041
174
174
  machineconfig/scripts/python/croshell_helpers/viewer_template.py,sha256=ve3Q1-iKhCLc0VJijKvAeOYp2xaFOeIOC_XW956GWCc,3944
175
175
  machineconfig/scripts/python/devops_helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
176
- machineconfig/scripts/python/devops_helpers/cli_config.py,sha256=91D4Hdk_ZhDtlJctBJ-gnVbbDCjyS9f7LE-MjRyRpkA,5276
176
+ machineconfig/scripts/python/devops_helpers/cli_config.py,sha256=yyzfxOKC1k6YRWERWUY7riIVDmiyB_L89wpBzmU5DBg,5402
177
177
  machineconfig/scripts/python/devops_helpers/cli_config_dotfile.py,sha256=rjTys4FNf9_feP9flWM7Zvq17dxWmetSiGaHPxp25nk,2737
178
178
  machineconfig/scripts/python/devops_helpers/cli_data.py,sha256=kvJ7g2CccjjXIhCwdu_Vlif8JHC0qUoLjuGcTSqT-IU,514
179
- machineconfig/scripts/python/devops_helpers/cli_nw.py,sha256=2MF9MgPCl4Slgy2n-g5-Wou-8EjgBRFsS-gmp_wai-4,4050
180
- machineconfig/scripts/python/devops_helpers/cli_repos.py,sha256=3d6UV39na-uAJC7dKqwnO79AKIeiVDie1_IPhk6SMNs,12015
181
- machineconfig/scripts/python/devops_helpers/cli_self.py,sha256=MvSfth2XILXHt_BWO9SeFKI9TCX-pUb8d-o0avNzVPc,4949
182
- machineconfig/scripts/python/devops_helpers/cli_share_server.py,sha256=285OzxttCx7YsrpOkaapMKP1eVGHmG5TkkaSQnY7i3c,3976
179
+ machineconfig/scripts/python/devops_helpers/cli_nw.py,sha256=nI_zmcmUvijVeXIWT2dN5onoy3ou-lub1cL-SJImmDA,4125
180
+ machineconfig/scripts/python/devops_helpers/cli_repos.py,sha256=GEsW0ykgu8mtoiXurOSjOlbY_Xrngy_aeBq4eRZY8ts,12335
181
+ machineconfig/scripts/python/devops_helpers/cli_self.py,sha256=6tNrchY6-QStf4LfpCRvy36gBM3_GJIGC2OVCiz-iNo,4986
182
+ machineconfig/scripts/python/devops_helpers/cli_share_server.py,sha256=q9pFJ6AxPuygMr3onMNOKEuuQHbVE_6Qoyo7xRT5FX0,4196
183
183
  machineconfig/scripts/python/devops_helpers/cli_terminal.py,sha256=k_PzXaiGyE0vXr0Ii1XcJz2A7UvyPJrR31TRWt4RKRI,6019
184
184
  machineconfig/scripts/python/devops_helpers/devops_backup_retrieve.py,sha256=nK47Rc7gQuDCnkk6_sW1y82gBnDJ9TdHU8XwMPFBK9c,5591
185
185
  machineconfig/scripts/python/devops_helpers/devops_status.py,sha256=PJVPhfhXq8der6Xd-_fjZfnizfM-RGfJApkRGhGBmNo,20525
@@ -218,15 +218,15 @@ machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py,sha25
218
218
  machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py,sha256=4MrlCVijbx7GQyAN9s5LDh-7heSjMXYrXdqiP6uC3ug,5378
219
219
  machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
220
220
  machineconfig/scripts/python/helpers_repos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
221
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py,sha256=XGwZYoSEt6e1Q2wyU-fH76I9lNgeSX8AEqw3Lmhj5CQ,9609
222
- machineconfig/scripts/python/helpers_repos/grource.py,sha256=IywQ1NDPcLXM5Tr9xhmq4tHfYspLRs3pF20LP2TlgIQ,14595
223
- machineconfig/scripts/python/helpers_repos/secure_repo.py,sha256=HWSCmSzSwmevDmnXO8iTm6l2Yhyt2G3E_MN63SHsyUM,1024
221
+ machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py,sha256=ANx-gfHd34Pb4_ptmlVDQnmLRUK42FMbja6On0Gs2kA,9700
222
+ machineconfig/scripts/python/helpers_repos/grource.py,sha256=zDKWAO24aA0HlpcKFgBH4Lh_eqWp9KTEqnbUnX6I2pk,14611
223
+ machineconfig/scripts/python/helpers_repos/secure_repo.py,sha256=fW_GyHqWrpnf7nexHojfWHv4eLBa71IhVL_LSVMyGnE,1115
224
224
  machineconfig/scripts/python/nw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
225
- machineconfig/scripts/python/nw/add_ssh_key.py,sha256=dYOK9vCB6I9YSeCLO7Hid1IaFjiEs9n_gugDSddtGU8,9298
225
+ machineconfig/scripts/python/nw/add_ssh_key.py,sha256=9JLmWu8pE7PAL5VuCFd19iVEdCR90LwY6_9P7gKQzEE,9373
226
226
  machineconfig/scripts/python/nw/devops_add_identity.py,sha256=aPjcHbTLhxYwWYcandyAHdwuO15ZBu3fB82u6bI0tMQ,3773
227
- machineconfig/scripts/python/nw/devops_add_ssh_key.py,sha256=EyLs2kc1A0Z-JncjDSleiBokgBzEaxlS-C024K4WuZQ,8847
227
+ machineconfig/scripts/python/nw/devops_add_ssh_key.py,sha256=CkIl85hZLtG9k7yXLSzqi88YrilHV4hIUWHAPBwxWjw,8922
228
228
  machineconfig/scripts/python/nw/mount_drive,sha256=zemKofv7hOmRN_V3qK0q580GkfWw3VdikyVVQyiu8j8,3514
229
- machineconfig/scripts/python/nw/mount_nfs,sha256=yybRX-lJ0V6wgTLknQB9rp6HwFBZdbfJzVnDvpHM8Xc,1855
229
+ machineconfig/scripts/python/nw/mount_nfs,sha256=0k6JHsJUky0L4BtGdRDPWfdSowBdLE-1b-T328HCb78,1855
230
230
  machineconfig/scripts/python/nw/mount_nfs.py,sha256=lOMDY4RS7tx8gsCazVR5tNNwFbaRyO2PJlnwBCDQgCM,3573
231
231
  machineconfig/scripts/python/nw/mount_nw_drive,sha256=BqjGBCbwe5ZAsZDO3L0zHhh_gJfZy1CYOcqXA4Y-WkQ,2262
232
232
  machineconfig/scripts/python/nw/mount_nw_drive.py,sha256=iru6AtnTyvyuk6WxlK5R4lDkuliVpPV5_uBTVVhXtjQ,1550
@@ -239,21 +239,21 @@ machineconfig/scripts/python/nw/wifi_conn.py,sha256=4GdLhgma9GRmZ6OFg3oxOX-qY3sr
239
239
  machineconfig/scripts/python/nw/wsl_windows_transfer.py,sha256=1ab9l-8MtAxofW5nGH9G2-BjlszaiLETu6WBECcNNhA,3546
240
240
  machineconfig/scripts/python/repos_helpers/action.py,sha256=pl0U53FAGoH2yk-CGNIy3aggImXY5ZVz28-XVFHDvfA,14862
241
241
  machineconfig/scripts/python/repos_helpers/clone.py,sha256=9vGb9NCXT0lkerPzOJjmFfhU8LSzE-_1LDvjkhgnal0,5461
242
- machineconfig/scripts/python/repos_helpers/count_lines.py,sha256=ZLEajCLmlFFY969BehabqGOB9_kkpATO3Lt09L7KULk,15968
243
- machineconfig/scripts/python/repos_helpers/count_lines_frontend.py,sha256=LuA4Tigy9eaBfdv2Y4Dnv0a8N0XikIUa-of9yR9LKqQ,568
242
+ machineconfig/scripts/python/repos_helpers/count_lines.py,sha256=Q5c7b-DxvTlQmljoic7niTuiAVyFlwYvkVQ7uRJHiTo,16009
243
+ machineconfig/scripts/python/repos_helpers/count_lines_frontend.py,sha256=KkkecMNXssfwBK9nLEXZgilq_DME1ah325MTRV6-z2c,607
244
244
  machineconfig/scripts/python/repos_helpers/entrypoint.py,sha256=UagEar85QCAXX7oOqJjDJp2Vds5UQxehYPmckL_S0oI,2836
245
245
  machineconfig/scripts/python/repos_helpers/record.py,sha256=3T5VmMbvywScZhTW2j4cGLK0T2LSWxKfnXkRTxkuLP4,10994
246
246
  machineconfig/scripts/python/repos_helpers/sync.py,sha256=CLLWy2n2gY9beXPF-mblOQ6R7cKoenkJjMiX7tHQsBk,3091
247
247
  machineconfig/scripts/python/repos_helpers/update.py,sha256=cUIMUMm-50HrY6fzxSMZnFplhToVjVPZMm1j_otTha4,11060
248
248
  machineconfig/scripts/python/sessions_helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
249
- machineconfig/scripts/python/sessions_helpers/sessions_multiprocess.py,sha256=6bmF1TOxzivNAIu8zsA9pu-f-RcYZLgdD4livjAf6ac,3069
249
+ machineconfig/scripts/python/sessions_helpers/sessions_multiprocess.py,sha256=zLssrCT3WRReiK0AFwctELN_o_svKypagUwJj0nT6i4,3122
250
250
  machineconfig/scripts/windows/fzfb.ps1,sha256=Bmngm2aY8hnPa3iKAOK6EPDYdKzGLUc81wYOnJhNoqg,149
251
251
  machineconfig/scripts/windows/fzfg.ps1,sha256=CHJbMrMuZePd4dxwIwz3g4XWAEmWmckuX-Nrx2xgRkg,27
252
252
  machineconfig/scripts/windows/fzfrga.bat,sha256=rU_KBMO6ii2EZ0akMnmDk9vpuhKSUZqkV0o8a8ywXcM,488
253
253
  machineconfig/scripts/windows/mounts/mount_nfs.ps1,sha256=XrAdzpxE6a4OccSmWJ7YWHJTnsZK8uXnFE5j9GOPA20,2026
254
254
  machineconfig/scripts/windows/mounts/mount_nw.ps1,sha256=puxcfZc3ZCJerm8pj8OZGVoTYkhzp-h7oV-MrksSqIE,454
255
255
  machineconfig/scripts/windows/mounts/mount_smb.ps1,sha256=PzYWpIO9BpwXjdWlUQL9pnMRnOGNSkxfh4bHukJFme8,69
256
- machineconfig/scripts/windows/mounts/mount_ssh.ps1,sha256=1BQAuvslqQDGRPAiQSoeJxE7NGw5hQwKDHv_XzW95Uk,322
256
+ machineconfig/scripts/windows/mounts/mount_ssh.ps1,sha256=nlbvxdqdUQXpKrOOsz_o3wUPVHmVYC4a6lxSoFFt4Qk,322
257
257
  machineconfig/scripts/windows/mounts/share_cloud.cmd,sha256=exD7JCdxw2LqVjw2MKCYHbVZlEqmelXtwnATng-dhJ4,1028
258
258
  machineconfig/scripts/windows/mounts/share_smb.ps1,sha256=U7x8ULYSjbgzTtiHNSKQuTaZ_apilDvkGV5Xm5hXk5M,384
259
259
  machineconfig/scripts/windows/mounts/unlock_bitlocker.ps1,sha256=Wv-SLscdckV-1mG3p82VXKPY9zW3hgkRmcLUXIZ1daE,253
@@ -323,7 +323,7 @@ machineconfig/settings/rofi/config.rasi,sha256=nDX5B8wdXQYF1fwiOTBRJUI4l_gQbYaLa
323
323
  machineconfig/settings/rofi/config_default.rasi,sha256=rTfKnC-bZuWX1l-lWQACCUOE1ShhkfykAxtXX9PlQHE,4694
324
324
  machineconfig/settings/shells/alacritty/alacritty.toml,sha256=EbL-2Y4QunW1pvRWB2yuLCw8MMPONheJr5LFoWRieUQ,871
325
325
  machineconfig/settings/shells/alacritty/alacritty.yml,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
326
- machineconfig/settings/shells/bash/init.sh,sha256=QK7RIX4LZRSFiaxKjwTijl4_QPRGtxJuLBvaZzCve8s,2263
326
+ machineconfig/settings/shells/bash/init.sh,sha256=lrHOvhT5xrKGhdYiR3uBiC4gGJ0IU8-sKuSRvvlxNHo,2267
327
327
  machineconfig/settings/shells/hyper/.hyper.js,sha256=h-HqeYlvPvPD4Ee7828Cxo87uVkzbMGJFqXTZIWoegw,8884
328
328
  machineconfig/settings/shells/ipy/profiles/default/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
329
329
  machineconfig/settings/shells/ipy/profiles/default/startup/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -331,7 +331,7 @@ machineconfig/settings/shells/ipy/profiles/default/startup/playext.py,sha256=OJ3
331
331
  machineconfig/settings/shells/kitty/kitty.conf,sha256=lDdx-dUX3jbKGb3BkS2f2TOpmgGiS-CI-_-lFvhD5A4,52870
332
332
  machineconfig/settings/shells/nushell/config.nu,sha256=ug0E0NXNlCzgStScFN6VTsAkUaOTPJZB69P-LS5L2VE,1047
333
333
  machineconfig/settings/shells/nushell/env.nu,sha256=4VmaXb-qP6qnMD5TPzkXMLFNlB5QC4l9HEzCvXZE2GQ,315
334
- machineconfig/settings/shells/pwsh/init.ps1,sha256=Srm187Y0ht_qGjI6QAyLcnmz-6jI3BdBGrtG5-V_e7g,2683
334
+ machineconfig/settings/shells/pwsh/init.ps1,sha256=ZbBKd1XkWLnKKkN-KgJBX__ynuc5aYIcIK5vmVXOyig,2685
335
335
  machineconfig/settings/shells/pwsh/profile.ps1,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
336
336
  machineconfig/settings/shells/starship/starship.toml,sha256=5rQTY7ZpKnrnhgu2Y9OJKUYMz5lPLIftO1p1VRuVZwQ,1150
337
337
  machineconfig/settings/shells/vtm/settings.xml,sha256=5TNXd-i0eUGo2w3tuhY9aOkwoJdqih8_HO_U6uL2Dts,18262
@@ -368,7 +368,7 @@ machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh,sha256=F5dbg0n9RHsKG
368
368
  machineconfig/setup_linux/ssh/openssh_all.sh,sha256=3dg6HEUFbHQOzLfSAtzK_D_GB8rGCCp_aBnxNdnidVc,824
369
369
  machineconfig/setup_linux/ssh/openssh_wsl.sh,sha256=1eeRGrloVB34K5z8yWVUMG5b9pV-WBfHgV9jqXiYgCQ,1398
370
370
  machineconfig/setup_linux/web_shortcuts/android.sh,sha256=gzep6bBhK7FCBvGcXK0fdJCtkSfBOftt0aFyDZq_eMs,68
371
- machineconfig/setup_linux/web_shortcuts/interactive.sh,sha256=Rl_1taVURx4PTBhbhQSh1m18k0qMAeFUtCardPqv5dw,448
371
+ machineconfig/setup_linux/web_shortcuts/interactive.sh,sha256=bYkiPvnI-UE4n28YZ7nPS1XK-U-flvjtG0wvFKitSBI,442
372
372
  machineconfig/setup_windows/__init__.py,sha256=NnSVZkIBoxoMgkj-_KAqGonH3YziBIWXOKDEcmNAGTY,386
373
373
  machineconfig/setup_windows/apps.ps1,sha256=G5GqZ9G0aiQr_A-HaahtRdzpaTTdW6n3DRKMZWDTSPc,11214
374
374
  machineconfig/setup_windows/uv.ps1,sha256=ukk1Abh-q-RfpoEqI2XTE2dcQJmHk0VFF6WqkK3TW8Q,350
@@ -378,7 +378,7 @@ machineconfig/setup_windows/others/power_options.ps1,sha256=c7Hn94jBD5GWF29CxMhm
378
378
  machineconfig/setup_windows/ssh/add-sshkey.ps1,sha256=qfPdqCpd9KP3VhH4ifsUm1Xvec7c0QVl4Wt8JIAm9HQ,1653
379
379
  machineconfig/setup_windows/ssh/add_identity.ps1,sha256=b8ZXpmNUSw3IMYvqSY7ClpdWPG39FS7MefoWnRhWN2U,506
380
380
  machineconfig/setup_windows/ssh/openssh-server.ps1,sha256=OMlYQdvuJQNxF5EILLPizB6BZAT3jAmDsv1WcVVxpFQ,2529
381
- machineconfig/setup_windows/web_shortcuts/interactive.ps1,sha256=7hQu8ywh0Cq258OK2rBE0X1dbNrXsaZ5SIQ7yLUZJj4,548
381
+ machineconfig/setup_windows/web_shortcuts/interactive.ps1,sha256=zbetiUwmwOWbIz_5iFWbxsRk5K-SBgLzOhdZ6JFRLS0,548
382
382
  machineconfig/setup_windows/wt_and_pwsh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
383
383
  machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py,sha256=ogxJnwpdcpH7N6dFJu95UCNoGYirZKQho_3X0F_hmXs,6791
384
384
  machineconfig/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -396,7 +396,7 @@ machineconfig/utils/procs.py,sha256=w75oGKfR7FpT1pGTGd2XscnEOO0IHBWxohLbi69hLqg,
396
396
  machineconfig/utils/scheduler.py,sha256=jZ_1yghqA3-aINPRmE_76gboqJc0UElroR7urNOfXKs,14940
397
397
  machineconfig/utils/scheduling.py,sha256=RF1iXJpqf4Dg18jdZWtBixz97KAHC6VKYqTFSpdLWuc,11188
398
398
  machineconfig/utils/source_of_truth.py,sha256=ZAnCRltiM07ig--P6g9_6nEAvNFC4X4ERFTVcvpIYsE,764
399
- machineconfig/utils/ssh.py,sha256=9TQgxsZCxF1rf2sIFcnj1-VWgjNZOU-5DIuW6s4UeNo,39079
399
+ machineconfig/utils/ssh.py,sha256=N9BchzFPC0BveM_OhUXLDJ8wwBDcMa9flN95Q_dPcIw,39079
400
400
  machineconfig/utils/terminal.py,sha256=IlmOByfQG-vjhaFFxxzU5rWzP5_qUzmalRfuey3PAmc,11801
401
401
  machineconfig/utils/tst.py,sha256=6u1GI49NdcpxH2BYGAusNfY5q9G_ytCGVzFM5b6HYpM,674
402
402
  machineconfig/utils/upgrade_packages.py,sha256=H96zVJEWXJW07nh5vhjuSCrPtXGqoUb7xeJsFYYdmCI,3330
@@ -413,7 +413,7 @@ machineconfig/utils/files/ouch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
413
413
  machineconfig/utils/files/ouch/decompress.py,sha256=7qPaEkMerBBXzeZyFn8hLODHZJv1aty-yGgwBxLgVys,1413
414
414
  machineconfig/utils/installer_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
415
415
  machineconfig/utils/installer_utils/github_release_bulk.py,sha256=WJf_qZlF02SmIc6C7o1h4Gy4gAaJAfeAS8O9s2Itj-k,6535
416
- machineconfig/utils/installer_utils/installer.py,sha256=bWFSIW05hDo6p1BsNqK-yCQL5ZNU_eZxCQW1QLLc-SA,9759
416
+ machineconfig/utils/installer_utils/installer.py,sha256=E1GqBJpVDGcYVX5LfiaQbLO2va2FrOMZOcwWiyP_nXw,9837
417
417
  machineconfig/utils/installer_utils/installer_abc.py,sha256=ZoMtINHD9cHEu4R5SYUWgHLTAqo4F2a33pBrEOGX4zs,11693
418
418
  machineconfig/utils/installer_utils/installer_class.py,sha256=apLMLmpZfHbj4I5ttgwg0ZIp66B5vx2nPtuhEobGdWM,17186
419
419
  machineconfig/utils/schemas/fire_agents/fire_agents_input.py,sha256=Xbi59rU35AzR7HZZ8ZQ8aUu_FjSgijNqc8Sme0rCk2Y,2050
@@ -421,8 +421,8 @@ machineconfig/utils/schemas/installer/installer_types.py,sha256=QClRY61QaduBPJoS
421
421
  machineconfig/utils/schemas/layouts/layout_types.py,sha256=TcqlZdGVoH8htG5fHn1KWXhRdPueAcoyApppZsPAPto,2020
422
422
  machineconfig/utils/schemas/repos/repos_types.py,sha256=ECVr-3IVIo8yjmYmVXX2mnDDN1SLSwvQIhx4KDDQHBQ,405
423
423
  machineconfig/utils/ssh_utils/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
424
- machineconfig-5.86.dist-info/METADATA,sha256=tBxtf8TPGwRCC6wxW0Oe01bWZTp1AVlFcmfU89P2z60,3013
425
- machineconfig-5.86.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
426
- machineconfig-5.86.dist-info/entry_points.txt,sha256=M0jwN_brZdXWhmNVeXLvdKxfkv8WhhXFZYcuKBA9qnk,418
427
- machineconfig-5.86.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
428
- machineconfig-5.86.dist-info/RECORD,,
424
+ machineconfig-5.88.dist-info/METADATA,sha256=-epwzNOMxIClqXyv0D85_N5be68VI9RPLl_-KqFoKZs,3012
425
+ machineconfig-5.88.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
426
+ machineconfig-5.88.dist-info/entry_points.txt,sha256=M0jwN_brZdXWhmNVeXLvdKxfkv8WhhXFZYcuKBA9qnk,418
427
+ machineconfig-5.88.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
428
+ machineconfig-5.88.dist-info/RECORD,,