machineconfig 3.5__py3-none-any.whl → 3.8__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 (32) hide show
  1. machineconfig/cluster/remote/cloud_manager.py +1 -1
  2. machineconfig/jobs/python/python_ve_symlink.py +1 -1
  3. machineconfig/profile/create.py +3 -3
  4. machineconfig/profile/shell.py +2 -2
  5. machineconfig/scripts/linux/{mcinit → initai} +1 -1
  6. machineconfig/scripts/python/ai/{mcinit.py → initai.py} +1 -1
  7. machineconfig/scripts/python/choose_wezterm_theme.py +2 -2
  8. machineconfig/scripts/python/cloud_mount.py +2 -2
  9. machineconfig/scripts/python/cloud_repo_sync.py +2 -2
  10. machineconfig/scripts/python/croshell.py +2 -2
  11. machineconfig/scripts/python/devops.py +2 -2
  12. machineconfig/scripts/python/devops_add_identity.py +3 -8
  13. machineconfig/scripts/python/devops_add_ssh_key.py +2 -4
  14. machineconfig/scripts/python/devops_backup_retrieve.py +2 -2
  15. machineconfig/scripts/python/devops_devapps_install.py +4 -4
  16. machineconfig/scripts/python/fire_agents.py +4 -4
  17. machineconfig/scripts/python/fire_jobs.py +5 -5
  18. machineconfig/scripts/python/fire_jobs_layout_helper.py +4 -4
  19. machineconfig/scripts/python/mount_nfs.py +3 -3
  20. machineconfig/scripts/python/start_terminals.py +2 -2
  21. machineconfig/scripts/windows/{mcinit.ps1 → initai.ps1} +1 -1
  22. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +2 -2
  23. machineconfig/utils/installer_utils/installer_class.py +3 -3
  24. machineconfig/utils/options.py +25 -18
  25. machineconfig/utils/path_helper.py +2 -2
  26. machineconfig/utils/procs.py +2 -2
  27. machineconfig/utils/scheduling.py +2 -2
  28. {machineconfig-3.5.dist-info → machineconfig-3.8.dist-info}/METADATA +1 -1
  29. {machineconfig-3.5.dist-info → machineconfig-3.8.dist-info}/RECORD +32 -32
  30. {machineconfig-3.5.dist-info → machineconfig-3.8.dist-info}/entry_points.txt +1 -1
  31. {machineconfig-3.5.dist-info → machineconfig-3.8.dist-info}/WHEEL +0 -0
  32. {machineconfig-3.5.dist-info → machineconfig-3.8.dist-info}/top_level.txt +0 -0
@@ -243,7 +243,7 @@
243
243
  # The reason it is not automated for remotes is because even though the server might have failed, the processes therein might be running, so there is no automated way to tell."""
244
244
  # log = self.read_log()
245
245
  # jobs_all: list[str] = [p.name for p in self.base_path.expanduser().joinpath("jobs").iterdir()]
246
- # jobs_selected = display_options(options=jobs_all, msg="Select Jobs to Redo", multi=True, fzf=True)
246
+ # jobs_selected = choose_from_options(options=jobs_all, msg="Select Jobs to Redo", multi=True, fzf=True)
247
247
  # for a_job in jobs_selected:
248
248
  # # find in which log list does this job live:
249
249
  # found_log_type = None
@@ -1,7 +1,7 @@
1
1
  """Symlinks"""
2
2
 
3
3
  from machineconfig.utils.path_extended import PathExtended as PathExtended
4
- # from machineconfig.utils.utils import display_options
4
+ # from machineconfig.utils.utils import choose_from_options
5
5
 
6
6
 
7
7
  def main():
@@ -8,7 +8,7 @@ from rich.console import Console
8
8
 
9
9
  from machineconfig.utils.path_extended import PathExtended as PathExtended
10
10
  from machineconfig.utils.links import symlink_func, symlink_copy
11
- from machineconfig.utils.options import display_options
11
+ from machineconfig.utils.options import choose_from_options
12
12
  from machineconfig.utils.source_of_truth import LIBRARY_ROOT, REPO_ROOT
13
13
  from machineconfig.profile.shell import create_default_shell_profile
14
14
 
@@ -53,13 +53,13 @@ def apply_mapper(choice: Optional[str] = None):
53
53
 
54
54
  program_keys.sort()
55
55
  if choice is None:
56
- choice_selected = display_options(msg="Which symlink to create?", options=program_keys + ["all", "none(EXIT)"], default="none(EXIT)", fzf=True, multi=True)
56
+ choice_selected = choose_from_options(msg="Which symlink to create?", options=program_keys + ["all", "none(EXIT)"], default="none(EXIT)", fzf=True, multi=True)
57
57
  assert isinstance(choice_selected, list)
58
58
  if len(choice_selected) == 1 and choice_selected[0] == "none(EXIT)":
59
59
  return # terminate function.
60
60
  elif len(choice_selected) == 1 and choice_selected[0] == "all":
61
61
  choice_selected = "all" # i.e. program_keys = program_keys
62
- # overwrite = display_options(msg="Overwrite existing source file?", options=["yes", "no"], default="yes") == "yes"
62
+ # overwrite = choose_from_options(msg="Overwrite existing source file?", options=["yes", "no"], default="yes") == "yes"
63
63
  from rich.prompt import Confirm
64
64
 
65
65
  prioritize_to_this = Confirm.ask("Overwrite existing source file?", default=True)
@@ -94,7 +94,7 @@ def create_default_shell_profile() -> None:
94
94
  # console.print(Panel("🔄 Adding sources to shell profile", title="[bold blue]Sources[/bold blue]", border_style="blue"))
95
95
 
96
96
  # if choice is None:
97
- # choice_obj = display_options(msg="Which patch to add?", options=sources + ["all", "none(EXIT)"], default="none(EXIT)", multi=True)
97
+ # choice_obj = choose_from_options(msg="Which patch to add?", options=sources + ["all", "none(EXIT)"], default="none(EXIT)", multi=True)
98
98
  # if isinstance(choice_obj, str):
99
99
  # if choice_obj == "all":
100
100
  # choice = choice_obj
@@ -139,7 +139,7 @@ def create_default_shell_profile() -> None:
139
139
  # console.print(Panel("🩹 Adding patches to shell profile", title="[bold blue]Patches[/bold blue]", border_style="blue"))
140
140
 
141
141
  # if choice is None:
142
- # choice_chosen = display_options(msg="Which patch to add?", options=list(patches) + ["all", "none(EXIT)"], default="none(EXIT)", multi=False)
142
+ # choice_chosen = choose_from_options(msg="Which patch to add?", options=list(patches) + ["all", "none(EXIT)"], default="none(EXIT)", multi=False)
143
143
  # assert isinstance(choice_chosen, str), f"Choice must be a string or a list of strings, not {type(choice)}"
144
144
  # choice = choice_chosen
145
145
  # if choice == "none(EXIT)":
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env bash
2
- uv run --python 3.13 --no-dev --project $HOME/code/machineconfig mcinit "$@"
2
+ uv run --python 3.13 --no-dev --project $HOME/code/machineconfig initai "$@"
@@ -29,7 +29,7 @@ uv add --upgrade-package pytest --dev
29
29
 
30
30
  subprocess.run(command_to_run, shell=True, check=True)
31
31
  else:
32
- print("Terminating mcinit ...")
32
+ print("Terminating initai ...")
33
33
  return
34
34
 
35
35
  dot_ai_dir = repo_root.joinpath(".ai")
@@ -2,7 +2,7 @@
2
2
  Choose a theme for Wezterm
3
3
  """
4
4
 
5
- from machineconfig.utils.options import choose_one_option
5
+ from machineconfig.utils.options import choose_from_options
6
6
  from machineconfig.utils.path_extended import PathExtended
7
7
  from typing import Any
8
8
  import time
@@ -45,7 +45,7 @@ schemes_list = [
45
45
 
46
46
  def main2():
47
47
  console.print(Panel("🎨 WezTerm Theme Selector", title_align="left", border_style="green"))
48
- option = choose_one_option(options=schemes_list, header="Choose a theme for Wezterm", fzf=True)
48
+ option = choose_from_options(multi=False, options=schemes_list, header="Choose a theme for Wezterm", fzf=True, msg="Use arrow keys to navigate, Enter to select a theme")
49
49
  set_theme(option)
50
50
  print(f"✅ Theme set to: {option}")
51
51
 
@@ -1,6 +1,6 @@
1
1
  """Cloud mount script"""
2
2
 
3
- from machineconfig.utils.options import choose_one_option
3
+ from machineconfig.utils.options import choose_from_options
4
4
  from machineconfig.utils.io import read_ini
5
5
  from machineconfig.utils.path_extended import PathExtended as PathExtended
6
6
 
@@ -59,7 +59,7 @@ def mount(cloud: Optional[str], network: Optional[str], destination: Optional[st
59
59
 
60
60
  config = get_rclone_config()
61
61
  if cloud is None:
62
- res = choose_one_option(msg="which cloud", options=config.sections(), header="CLOUD MOUNT", default=None)
62
+ res = choose_from_options(multi=False, msg="which cloud", options=config.sections(), header="CLOUD MOUNT", default=None)
63
63
  if type(res) is str:
64
64
  cloud = res
65
65
  else:
@@ -9,7 +9,7 @@ from machineconfig.utils.accessories import randstr
9
9
 
10
10
  from machineconfig.scripts.python.helpers.repo_sync_helpers import fetch_dotfiles
11
11
  from machineconfig.utils.source_of_truth import CONFIG_PATH, DEFAULTS_PATH
12
- from machineconfig.utils.options import choose_one_option
12
+ from machineconfig.utils.options import choose_from_options
13
13
  from machineconfig.utils.code import get_shell_file_executing_python_script, write_shell_script_to_file
14
14
  import platform
15
15
  import argparse
@@ -141,7 +141,7 @@ git commit -am "finished merging"
141
141
  program_content = None
142
142
  match action:
143
143
  case "ask":
144
- choice = choose_one_option(options=[option1, option2, option3, option4], fzf=False)
144
+ choice = choose_from_options(multi=False, msg="Choose one option", options=[option1, option2, option3, option4], fzf=False)
145
145
  if choice == option1:
146
146
  program_content = shell_file_1.read_text(encoding="utf-8")
147
147
  elif choice == option2:
@@ -8,7 +8,7 @@ import argparse
8
8
  from machineconfig.utils.path_extended import PathExtended as PathExtended
9
9
  from machineconfig.utils.accessories import randstr
10
10
 
11
- from machineconfig.utils.options import display_options
11
+ from machineconfig.utils.options import choose_from_options
12
12
  from machineconfig.utils.ve import get_ve_activate_line
13
13
  from typing import Optional
14
14
  from rich.console import Console
@@ -121,7 +121,7 @@ def build_parser():
121
121
  text = "🔍 Searching for Python files..."
122
122
  console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
123
123
  options = [str(item) for item in PathExtended.cwd().search("*.py", r=True)]
124
- file = display_options(msg="Choose a python file to run", options=options, fzf=True, multi=False)
124
+ file = choose_from_options(msg="Choose a python file to run", options=options, fzf=True, multi=False)
125
125
  assert isinstance(file, str)
126
126
  program = PathExtended(file).read_text(encoding="utf-8")
127
127
  text = f"📄 Selected file: {PathExtended(file).name}"
@@ -1,6 +1,6 @@
1
1
  """devops with emojis"""
2
2
 
3
- from machineconfig.utils.options import display_options
3
+ from machineconfig.utils.options import choose_from_options
4
4
 
5
5
  from platform import system
6
6
  from enum import Enum
@@ -45,7 +45,7 @@ def main(which: Optional[str] = None):
45
45
  options = [op.value for op in Options]
46
46
  if which is None:
47
47
  try:
48
- choice_key = display_options(msg="", options=options, header="🛠️ DEVOPS", default=options[0])
48
+ choice_key = choose_from_options(msg="", options=options, header="🛠️ DEVOPS", default=options[0], multi=False)
49
49
  except KeyboardInterrupt:
50
50
  console.print(Panel("❌ Operation cancelled by user", title_align="left", border_style="red", width=BOX_WIDTH))
51
51
  return
@@ -2,7 +2,7 @@
2
2
 
3
3
  # from platform import system
4
4
  from machineconfig.utils.path_extended import PathExtended as PathExtended
5
- from machineconfig.utils.options import display_options
5
+ from machineconfig.utils.options import choose_from_options
6
6
  from rich.panel import Panel
7
7
  from rich.text import Text
8
8
 
@@ -22,7 +22,7 @@ def main() -> None:
22
22
  else:
23
23
  print(Panel("⚠️ No SSH private keys found", expand=False))
24
24
 
25
- choice = display_options(msg="Path to private key to be used when ssh'ing: ", options=[str(x) for x in private_keys] + ["I have the path to the key file", "I want to paste the key itself"])
25
+ choice = choose_from_options(msg="Path to private key to be used when ssh'ing: ", options=[str(x) for x in private_keys] + ["I have the path to the key file", "I want to paste the key itself"], multi=False)
26
26
 
27
27
  if choice == "I have the path to the key file":
28
28
  print(Panel("📄 Please enter the path to your private key file", expand=False))
@@ -37,15 +37,10 @@ def main() -> None:
37
37
  path_to_key.write_text(input("🔑 Paste the private key here: "), encoding="utf-8")
38
38
  print(Panel(f"💾 Key saved to: {path_to_key}", expand=False))
39
39
 
40
- elif isinstance(choice, str):
40
+ else:
41
41
  path_to_key = PathExtended(choice)
42
42
  print(Panel(f"🔑 Using selected key: {path_to_key.name}", expand=False))
43
43
 
44
- else:
45
- error_message = f"❌ ERROR: Invalid choice\nThe selected option is not supported: {choice}"
46
- print(Panel(Text(error_message, justify="center"), expand=False, border_style="red"))
47
- raise NotImplementedError(f"Choice {choice} not supported")
48
-
49
44
  txt = f"IdentityFile {path_to_key.collapseuser().as_posix()}" # adds this id for all connections, no host specified.
50
45
  config_path = PathExtended.home().joinpath(".ssh/config")
51
46
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  from platform import system
4
4
  from machineconfig.utils.source_of_truth import LIBRARY_ROOT
5
- from machineconfig.utils.options import display_options
5
+ from machineconfig.utils.options import choose_from_options
6
6
  from machineconfig.utils.path_extended import PathExtended as PathExtended
7
7
  from rich.console import Console
8
8
  from rich.panel import Panel
@@ -84,9 +84,7 @@ def main() -> None:
84
84
  i_have_path_option = "I have the path to the key file"
85
85
  i_paste_option = "I want to paste the key itself"
86
86
 
87
- res = display_options("Which public key to add? ", options=[str(x) for x in pub_keys] + [all_keys_option, i_have_path_option, i_paste_option])
88
- assert isinstance(res, str), f"Got {res} of type {type(res)} instead of str."
89
-
87
+ res = choose_from_options("Which public key to add? ", options=[str(x) for x in pub_keys] + [all_keys_option, i_have_path_option, i_paste_option], multi=False)
90
88
  if res == all_keys_option:
91
89
  console.print(Panel(f"🔄 Processing all {len(pub_keys)} public keys...", title="[bold blue]Processing[/bold blue]", border_style="blue"))
92
90
  program = "\n\n\n".join([get_add_ssh_key_script(key) for key in pub_keys])
@@ -5,7 +5,7 @@ from machineconfig.utils.io import read_ini
5
5
  from machineconfig.utils.path_extended import PathExtended as PathExtended
6
6
  from machineconfig.utils.source_of_truth import LIBRARY_ROOT, DEFAULTS_PATH
7
7
  from machineconfig.utils.code import print_code
8
- from machineconfig.utils.options import choose_cloud_interactively, choose_multiple_options
8
+ from machineconfig.utils.options import choose_cloud_interactively, choose_from_options
9
9
  from machineconfig.scripts.python.helpers.helpers2 import ES
10
10
  from platform import system
11
11
  from typing import Any, Literal, Optional
@@ -40,7 +40,7 @@ def main_backup_retrieve(direction: OPTIONS, which: Optional[str] = None) -> Non
40
40
 
41
41
  if which is None:
42
42
  console.print(Panel(f"🔍 SELECT {direction} ITEMS\n📋 Choose which configuration entries to process", title="[bold blue]Select Items[/bold blue]", border_style="blue"))
43
- choices = choose_multiple_options(msg=f"WHICH FILE of the following do you want to {direction}?", options=["all"] + list(bu_file.keys()))
43
+ choices = choose_from_options(multi=True, msg=f"WHICH FILE of the following do you want to {direction}?", options=["all"] + list(bu_file.keys()))
44
44
  else:
45
45
  choices = which.split(",") if which else []
46
46
  console.print(Panel(f"🔖 PRE-SELECTED ITEMS\n📝 Using: {', '.join(choices)}", title="[bold blue]Pre-selected Items[/bold blue]", border_style="blue"))
@@ -3,7 +3,7 @@
3
3
  # import subprocess
4
4
  from rich.progress import Progress, SpinnerColumn, TextColumn
5
5
  from machineconfig.utils.source_of_truth import LIBRARY_ROOT
6
- from machineconfig.utils.options import choose_multiple_options
6
+ from machineconfig.utils.options import choose_from_options
7
7
  from machineconfig.utils.installer import get_installers, install_all
8
8
  from platform import system
9
9
  from typing import Any, Optional, Literal, TypeAlias, get_args
@@ -59,7 +59,7 @@ def main(which: Optional[WHICH_CAT | str]) -> None:
59
59
 
60
60
  options += list(get_args(WHICH_CAT))
61
61
  # print("s"*1000)
62
- program_names = choose_multiple_options(msg="", options=options, header="🚀 CHOOSE DEV APP", default="AllEssentials")
62
+ program_names = choose_from_options(multi=True, msg="", options=options, header="🚀 CHOOSE DEV APP", default="AllEssentials")
63
63
 
64
64
  total_commands = ""
65
65
  installation_messages: list[str] = []
@@ -112,7 +112,7 @@ def get_programs_by_category(program_name: WHICH_CAT):
112
112
  options_system = {**options_system_1, **options_system_2}
113
113
  else:
114
114
  raise NotImplementedError(f"❌ System {system()} not supported")
115
- program_names = choose_multiple_options(msg="", options=sorted(list(options_system.keys())), header="🚀 CHOOSE DEV APP")
115
+ program_names = choose_from_options(multi=True, msg="", options=sorted(list(options_system.keys())), header="🚀 CHOOSE DEV APP")
116
116
  program = ""
117
117
  for name in program_names:
118
118
  print(f"""
@@ -127,7 +127,7 @@ def get_programs_by_category(program_name: WHICH_CAT):
127
127
  # case "OtherDevApps":
128
128
  # installers = get_installers(dev=True, system=system())
129
129
  # options__: list[str] = [x.get_description() for x in tqdm(installers, desc="Checking installed programs")]
130
- # program_names = choose_multiple_options(msg="", options=sorted(options__) + ["all"], header="CHOOSE DEV APP")
130
+ # program_names = choose_from_options(multi=True, msg="", options=sorted(options__) + ["all"], header="CHOOSE DEV APP")
131
131
  # if "all" in program_names: program_names = options__
132
132
  # program = ""
133
133
  # print("Installing:")
@@ -15,7 +15,7 @@ import sys
15
15
  from machineconfig.scripts.python.fire_agents_help_launch import prep_agent_launch, get_agents_launch_layout, AGENTS
16
16
  from machineconfig.scripts.python.fire_agents_help_search import search_files_by_pattern, search_python_files
17
17
  from machineconfig.scripts.python.fire_agents_load_balancer import chunk_prompts, SPLITTING_STRATEGY, DEFAULT_AGENT_CAP
18
- from machineconfig.utils.options import choose_one_option
18
+ from machineconfig.utils.options import choose_from_options
19
19
  from machineconfig.utils.schemas.layouts.layout_types import TabConfig, LayoutConfig
20
20
  from machineconfig.utils.accessories import get_repo_root
21
21
 
@@ -80,9 +80,9 @@ def main(): # noqa: C901 - (complexity acceptable for CLI glue)
80
80
  sys.exit(1)
81
81
  print(f"Operating @ {repo_root}")
82
82
 
83
- search_strategy = cast(SEARCH_STRATEGIES, choose_one_option(header="Choose search strategy:", options=get_args(SEARCH_STRATEGIES)))
84
- splitting_strategy = cast(SPLITTING_STRATEGY, choose_one_option(header="Choose prompt splitting strategy:", options=get_args(SPLITTING_STRATEGY)))
85
- agent_selected = cast(AGENTS, choose_one_option(header="Select agent type", options=get_args(AGENTS)))
83
+ search_strategy = cast(SEARCH_STRATEGIES, choose_from_options(multi=False, msg="Choose one option", header="Choose search strategy:", options=get_args(SEARCH_STRATEGIES)))
84
+ splitting_strategy = cast(SPLITTING_STRATEGY, choose_from_options(multi=False, msg="Choose one option", header="Choose prompt splitting strategy:", options=get_args(SPLITTING_STRATEGY)))
85
+ agent_selected = cast(AGENTS, choose_from_options(multi=False, msg="Choose one option", header="Select agent type", options=get_args(AGENTS)))
86
86
  print("Enter prefix prompt (end with Ctrl-D / Ctrl-Z):")
87
87
  prompt_prefix = "\n".join(sys.stdin.readlines())
88
88
  job_name = input("Enter job name [AI_AGENTS]: ") or "AI_Agents"
@@ -2,7 +2,7 @@
2
2
  fire
3
3
 
4
4
  # https://github.com/pallets/click combine with fire. Consider
5
- # https://github.com/ceccopierangiolieugenio/pyTermTk for display_options build TUI
5
+ # https://github.com/ceccopierangiolieugenio/pyTermTk for choose_from_options build TUI
6
6
  # https://github.com/chriskiehl/Gooey build commandline interface
7
7
 
8
8
  """
@@ -12,7 +12,7 @@ from machineconfig.scripts.python.helpers.helpers4 import convert_kwargs_to_fire
12
12
  from machineconfig.scripts.python.helpers.helpers4 import parse_pyfile
13
13
  from machineconfig.scripts.python.helpers.helpers4 import get_import_module_code
14
14
  from machineconfig.utils.ve import get_ve_activate_line, get_ve_path_and_ipython_profile
15
- from machineconfig.utils.options import display_options, choose_one_option
15
+ from machineconfig.utils.options import choose_from_options
16
16
  from machineconfig.utils.path_helper import match_file_name, sanitize_path
17
17
 
18
18
  from machineconfig.utils.path_extended import PathExtended as PathExtended
@@ -39,7 +39,7 @@ def route(args: FireJobArgs) -> None:
39
39
  print(f"🔍 Searching recursively for Python, PowerShell and Shell scripts in directory `{path_obj}`")
40
40
  files = search_for_files_of_interest(path_obj)
41
41
  print(f"🔍 Got #{len(files)} results.")
42
- choice_file = choose_one_option(options=files, fzf=True)
42
+ choice_file = choose_from_options(multi=False, options=files, fzf=True, msg="Choose one option")
43
43
  choice_file = PathExtended(choice_file)
44
44
  else:
45
45
  choice_file = path_obj
@@ -60,7 +60,7 @@ def route(args: FireJobArgs) -> None:
60
60
  if args.choose_function or args.submit_to_cloud:
61
61
  if choice_file.suffix == ".py":
62
62
  options, func_args = parse_pyfile(file_path=str(choice_file))
63
- choice_function_tmp = display_options(msg="Choose a function to run", options=options, fzf=True, multi=False)
63
+ choice_function_tmp = choose_from_options(msg="Choose a function to run", options=options, fzf=True, multi=False)
64
64
  assert isinstance(choice_function_tmp, str), f"choice_function must be a string. Got {type(choice_function_tmp)}"
65
65
  choice_index = options.index(choice_function_tmp)
66
66
  choice_function = choice_function_tmp.split(" -- ")[0]
@@ -81,7 +81,7 @@ def route(args: FireJobArgs) -> None:
81
81
  if line.startswith("echo"):
82
82
  continue
83
83
  options.append(line)
84
- chosen_lines = display_options(msg="Choose a line to run", options=options, fzf=True, multi=True)
84
+ chosen_lines = choose_from_options(msg="Choose a line to run", options=options, fzf=True, multi=True)
85
85
  choice_file = PathExtended.tmpfile(suffix=".sh")
86
86
  choice_file.parent.mkdir(parents=True, exist_ok=True)
87
87
  choice_file.write_text("\n".join(chosen_lines), encoding="utf-8")
@@ -2,7 +2,7 @@ from pathlib import Path
2
2
  from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig, LayoutsFile
3
3
  from typing import Optional, TYPE_CHECKING
4
4
  from machineconfig.scripts.python.helpers.helpers4 import search_for_files_of_interest
5
- from machineconfig.utils.options import choose_one_option
5
+ from machineconfig.utils.options import choose_from_options
6
6
  from machineconfig.utils.path_helper import match_file_name, sanitize_path
7
7
  from machineconfig.utils.path_extended import PathExtended as PathExtended
8
8
 
@@ -18,9 +18,9 @@ def select_layout(layouts_json_file: Path, layout_name: Optional[str]):
18
18
  raise ValueError(f"No layouts found in {layouts_json_file}")
19
19
  if layout_name is None:
20
20
  options = [layout["layoutName"] for layout in layout_file["layouts"]]
21
- from machineconfig.utils.options import choose_one_option
21
+ from machineconfig.utils.options import choose_from_options
22
22
 
23
- layout_name = choose_one_option(options=options, prompt="Choose a layout configuration:", fzf=True)
23
+ layout_name = choose_from_options(multi=False, options=options, prompt="Choose a layout configuration:", fzf=True, msg="Choose one option")
24
24
  print(f"Selected layout: {layout_name}")
25
25
  layout_chosen = next((layout for layout in layout_file["layouts"] if layout["layoutName"] == layout_name), None)
26
26
  if layout_chosen is None:
@@ -59,7 +59,7 @@ def handle_layout_args(args: "FireJobArgs") -> None:
59
59
  print(f"🔍 Searching recursively for Python, PowerShell and Shell scripts in directory `{path_obj}`")
60
60
  files = search_for_files_of_interest(path_obj)
61
61
  print(f"🔍 Got #{len(files)} results.")
62
- choice_file = choose_one_option(options=files, fzf=True)
62
+ choice_file = choose_from_options(multi=False, options=files, fzf=True, msg="Choose one option")
63
63
  choice_file = PathExtended(choice_file)
64
64
  else:
65
65
  choice_file = path_obj
@@ -3,7 +3,7 @@
3
3
  from machineconfig.utils.path_extended import PathExtended as PathExtended
4
4
  from machineconfig.utils.ssh import SSH
5
5
  from machineconfig.utils.terminal import Terminal
6
- from machineconfig.utils.options import display_options, choose_ssh_host
6
+ from machineconfig.utils.options import choose_from_options, choose_ssh_host
7
7
 
8
8
  import platform
9
9
 
@@ -20,7 +20,7 @@ def main():
20
20
  assert isinstance(tmp, str)
21
21
  ssh = SSH(tmp)
22
22
  default = f"{ssh.hostname}:{ssh.run('echo $HOME').op}/data/share_nfs"
23
- share_info = display_options("📂 Choose a share path:", options=[f"{ssh.hostname}:{item.split(' ')[0]}" for item in ssh.run("cat /etc/exports").op.split("\n") if not item.startswith("#")] + [default], default=default)
23
+ share_info = choose_from_options(msg="📂 Choose a share path:", options=[f"{ssh.hostname}:{item.split(' ')[0]}" for item in ssh.run("cat /etc/exports").op.split("\n") if not item.startswith("#")] + [default], default=default, multi=False)
24
24
  assert isinstance(share_info, str), f"❌ share_info must be a string. Got {type(share_info)}"
25
25
 
26
26
  remote_server = share_info.split(":")[0]
@@ -38,7 +38,7 @@ def main():
38
38
  mount_path_3 = mount_path_2
39
39
 
40
40
  print("🔧 Preparing mount paths...")
41
- local_mount_point = display_options(msg="📂 Choose mount path OR input custom one:", options=[mount_path_1, mount_path_2, mount_path_3], default=mount_path_2, custom_input=True)
41
+ local_mount_point = choose_from_options(msg="📂 Choose mount path OR input custom one:", options=[mount_path_1, mount_path_2, mount_path_3], default=mount_path_2, custom_input=True, multi=False)
42
42
  assert isinstance(local_mount_point, PathExtended), f"❌ local_mount_point must be a pathlib.Path. Got {type(local_mount_point)}"
43
43
  local_mount_point = PathExtended(local_mount_point).expanduser()
44
44
 
@@ -1,6 +1,6 @@
1
1
  """Script to start terminals on windows and wsl"""
2
2
 
3
- from machineconfig.utils.options import display_options, get_ssh_hosts
3
+ from machineconfig.utils.options import choose_from_options, get_ssh_hosts
4
4
  import platform
5
5
  from itertools import cycle
6
6
  from typing import Literal
@@ -98,7 +98,7 @@ def main():
98
98
  else:
99
99
  if args.hosts is None:
100
100
  print("🌐 No hosts provided. Displaying options...")
101
- hosts = display_options(msg="Select hosts:", options=get_ssh_hosts() + [THIS_MACHINE], multi=True, fzf=True)
101
+ hosts = choose_from_options(msg="Select hosts:", options=get_ssh_hosts() + [THIS_MACHINE], multi=True, fzf=True)
102
102
  else:
103
103
  print("🌐 Using provided hosts:", args.hosts)
104
104
  hosts = args.hosts
@@ -1 +1 @@
1
- uv run --python 3.13 --no-dev --project $HOME/code/machineconfig mcinit $args
1
+ uv run --python 3.13 --no-dev --project $HOME/code/machineconfig initai $args
@@ -26,8 +26,8 @@
26
26
  # @register_line_magic("codei") # type: ignore
27
27
  # def print_code_interactive(_):
28
28
  # res = get_names()
29
- # from machineconfig.utils.utils import choose_one_option
30
- # choice = choose_one_option(options=res["<class 'function'>"], msg="Choose a type to inspect", fzf=True)
29
+ # from machineconfig.utils.utils import choose_from_options
30
+ # choice = choose_from_options(multi=False, options=res["<class 'function'>"], msg="Choose a type to inspect", fzf=True)
31
31
  # obj = eval(choice, globals(), locals()) # type: ignore # pylint: disable=eval-used
32
32
  # from rich.syntax import Syntax
33
33
  # import inspect
@@ -37,12 +37,12 @@ class Installer:
37
37
  @staticmethod
38
38
  def choose_app_and_install():
39
39
  print(f"\n{'=' * 80}\n🔍 SELECT APPLICATION TO INSTALL 🔍\n{'=' * 80}")
40
- from machineconfig.utils.options import choose_one_option
40
+ from machineconfig.utils.options import choose_from_options
41
41
 
42
42
  print("📂 Searching for configuration files...")
43
43
  jobs_dir = Path(LIBRARY_ROOT.joinpath("jobs"))
44
44
  config_paths = [Path(p) for p in jobs_dir.rglob("config.json")]
45
- path = choose_one_option(options=config_paths)
45
+ path = choose_from_options(multi=False, options=config_paths, msg="Choose one option")
46
46
  print(f"📄 Loading configuration from: {path}")
47
47
  config_data = read_json(path)
48
48
  installer_data_files = InstallerDataFiles(config_data)
@@ -50,7 +50,7 @@ class Installer:
50
50
  # Extract app names from the installers
51
51
  app_names = [installer["appName"] for installer in installer_data_files["installers"]]
52
52
  print("🔍 Select an application to install:")
53
- app_name = choose_one_option(options=app_names, fzf=True)
53
+ app_name = choose_from_options(multi=False, options=app_names, fzf=True, msg="Choose one option")
54
54
 
55
55
  # Find the selected installer data
56
56
  selected_installer_data = None
@@ -4,7 +4,7 @@ from rich.panel import Panel
4
4
  from rich.console import Console
5
5
  import platform
6
6
  import subprocess
7
- from typing import Optional, Union, Iterable
7
+ from typing import Optional, Union, Iterable, overload, Literal
8
8
  from machineconfig.utils.source_of_truth import WINDOWS_INSTALL_PATH, LINUX_INSTALL_PATH
9
9
 
10
10
 
@@ -32,20 +32,23 @@ def check_tool_exists(tool_name: str) -> bool:
32
32
  # return root_path.joinpath(tool_name).is_file()
33
33
 
34
34
 
35
- def choose_one_option[T](options: Iterable[T], header: str = "", tail: str = "", prompt: str = "", msg: str = "", default: Optional[T] = None, fzf: bool = False, custom_input: bool = False) -> T:
36
- choice_key = display_options(msg=msg, options=options, header=header, tail=tail, prompt=prompt, default=default, fzf=fzf, multi=False, custom_input=custom_input)
37
- assert not isinstance(choice_key, list)
38
- return choice_key
35
+ # def choose_from_options[T](options: Iterable[T], header: str = "", tail: str = "", prompt: str = "", msg: str = "", default: Optional[T] = None, fzf: bool = False, custom_input: bool = False) -> T:
36
+ # choice_key = choose_from_options(msg=msg, options=options, header=header, tail=tail, prompt=prompt, default=default, fzf=fzf, multi=False, custom_input=custom_input)
37
+ # assert not isinstance(choice_key, list)
38
+ # return choice_key
39
39
 
40
40
 
41
- def choose_multiple_options[T](options: Iterable[T], header: str = "", tail: str = "", prompt: str = "", msg: str = "", default: Optional[T] = None, custom_input: bool = False) -> list[T]:
42
- choice_key = display_options(msg=msg, options=options, header=header, tail=tail, prompt=prompt, default=default, fzf=True, multi=True, custom_input=custom_input)
43
- if isinstance(choice_key, list):
44
- return choice_key
45
- return [choice_key]
41
+ # def choose_from_options[T](options: Iterable[T], header: str = "", tail: str = "", prompt: str = "", msg: str = "", default: Optional[T] = None, custom_input: bool = False) -> list[T]:
42
+ # choice_key = choose_from_options(msg=msg, options=options, header=header, tail=tail, prompt=prompt, default=default, fzf=True, multi=True, custom_input=custom_input)
43
+ # if isinstance(choice_key, list):
44
+ # return choice_key
45
+ # return [choice_key]
46
46
 
47
-
48
- def display_options[T](msg: str, options: Iterable[T], header: str = "", tail: str = "", prompt: str = "", default: Optional[T] = None, fzf: bool = False, multi: bool = False, custom_input: bool = False) -> Union[T, list[T]]:
47
+ @overload
48
+ def choose_from_options[T](msg: str, options: Iterable[T], multi: Literal[False], custom_input: bool = False, header: str = "", tail: str = "", prompt: str = "", default: Optional[T] = None, fzf: bool = False) -> T: ...
49
+ @overload
50
+ def choose_from_options[T](msg: str, options: Iterable[T], multi: Literal[True], custom_input: bool = True, header: str = "", tail: str = "", prompt: str = "", default: Optional[T] = None, fzf: bool = False, ) -> list[T]: ...
51
+ def choose_from_options[T](msg: str, options: Iterable[T], multi: bool, custom_input: bool = True, header: str = "", tail: str = "", prompt: str = "", default: Optional[T] = None, fzf: bool = False, ) -> Union[T, list[T]]:
49
52
  # TODO: replace with https://github.com/tmbo/questionary
50
53
  # # also see https://github.com/charmbracelet/gum
51
54
  tool_name = "fzf"
@@ -90,7 +93,7 @@ def display_options[T](msg: str, options: Iterable[T], header: str = "", tail: s
90
93
  if choice_string == "":
91
94
  if default_string is None:
92
95
  console.print(Panel("🧨 Default option not available!", title="Error", expand=False))
93
- return display_options(msg=msg, options=options, header=header, tail=tail, prompt=prompt, default=default, fzf=fzf, multi=multi, custom_input=custom_input)
96
+ return choose_from_options(msg=msg, options=options, header=header, tail=tail, prompt=prompt, default=default, fzf=fzf, multi=multi, custom_input=custom_input)
94
97
  choice_idx = options_strings.index(default_string)
95
98
  assert default is not None, "🧨 Default option not available!"
96
99
  choice_one: T = default
@@ -108,7 +111,7 @@ def display_options[T](msg: str, options: Iterable[T], header: str = "", tail: s
108
111
  _ = ie
109
112
  # raise ValueError(f"Unknown choice. {choice_string}") from ie
110
113
  console.print(Panel(f"❓ Unknown choice: '{choice_string}'", title="Error", expand=False))
111
- return display_options(msg=msg, options=options, header=header, tail=tail, prompt=prompt, default=default, fzf=fzf, multi=multi, custom_input=custom_input)
114
+ return choose_from_options(msg=msg, options=options, header=header, tail=tail, prompt=prompt, default=default, fzf=fzf, multi=multi, custom_input=custom_input)
112
115
  except TypeError as te: # int(choice_string) failed due to # either the number is invalid, or the input is custom.
113
116
  if choice_string in options_strings: # string input
114
117
  choice_idx = options_strings.index(choice_one) # type: ignore
@@ -119,7 +122,7 @@ def display_options[T](msg: str, options: Iterable[T], header: str = "", tail: s
119
122
  _ = te
120
123
  # raise ValueError(f"Unknown choice. {choice_string}") from te
121
124
  console.print(Panel(f"❓ Unknown choice: '{choice_string}'", title="Error", expand=False))
122
- return display_options(msg=msg, options=options, header=header, tail=tail, prompt=prompt, default=default, fzf=fzf, multi=multi, custom_input=custom_input)
125
+ return choose_from_options(msg=msg, options=options, header=header, tail=tail, prompt=prompt, default=default, fzf=fzf, multi=multi, custom_input=custom_input)
123
126
  console.print(Panel(f"✅ Selected option {choice_idx}: {choice_one}", title="Selected", expand=False))
124
127
  if multi:
125
128
  return [choice_one]
@@ -138,7 +141,7 @@ def choose_cloud_interactively() -> str:
138
141
  raise ValueError(f"Got {tmp} from rclone listremotes")
139
142
  if len(remotes) == 0:
140
143
  raise RuntimeError("You don't have remotes. Configure your rclone first to get cloud services access.")
141
- cloud: str = choose_one_option(msg="WHICH CLOUD?", options=list(remotes), default=remotes[0], fzf=True)
144
+ cloud: str = choose_from_options(msg="WHICH CLOUD?", multi=False, options=list(remotes), default=remotes[0], fzf=True)
142
145
  console.print(Panel(f"✅ SELECTED CLOUD | {cloud}", border_style="bold blue", expand=False))
143
146
  return cloud
144
147
 
@@ -151,5 +154,9 @@ def get_ssh_hosts() -> list[str]:
151
154
  return list(c.get_hostnames())
152
155
 
153
156
 
154
- def choose_ssh_host(multi: bool = True):
155
- return display_options(msg="", options=get_ssh_hosts(), multi=multi, fzf=True)
157
+ @overload
158
+ def choose_ssh_host(multi: Literal[False]) -> str: ...
159
+ @overload
160
+ def choose_ssh_host(multi: Literal[True]) -> list[str]: ...
161
+ def choose_ssh_host(multi: bool):
162
+ return choose_from_options(msg="", options=get_ssh_hosts(), multi=multi, fzf=True)
@@ -1,5 +1,5 @@
1
1
  from machineconfig.utils.path_extended import PathExtended as PathExtended
2
- from machineconfig.utils.options import choose_one_option
2
+ from machineconfig.utils.options import choose_from_options
3
3
  from machineconfig.utils.source_of_truth import EXCLUDE_DIRS
4
4
  from rich.console import Console
5
5
  from rich.panel import Panel
@@ -83,7 +83,7 @@ def match_file_name(sub_string: str, search_root: PathExtended, suffixes: set[st
83
83
  if len(reduced_scripts) == 1:
84
84
  return PathExtended(reduced_scripts[0])
85
85
  elif len(reduced_scripts) > 1:
86
- choice = choose_one_option(msg="Multiple matches found", options=reduced_scripts, fzf=True)
86
+ choice = choose_from_options(multi=False, msg="Multiple matches found", options=reduced_scripts, fzf=True)
87
87
  return PathExtended(choice)
88
88
  print(f"Result: This still generated {len(reduced_scripts)} results.")
89
89
  if len(reduced_scripts) < 10:
@@ -3,7 +3,7 @@
3
3
  import psutil
4
4
  from rich.progress import Progress, SpinnerColumn, TextColumn
5
5
  from zoneinfo import ZoneInfo
6
- from machineconfig.utils.options import display_options
6
+ from machineconfig.utils.options import choose_from_options
7
7
  from typing import Optional, Any
8
8
  from rich.console import Console
9
9
  from rich.panel import Panel
@@ -120,7 +120,7 @@ class ProcessManager:
120
120
  # Format data as table for display
121
121
  formatted_data = self._format_process_table()
122
122
  options = formatted_data.split("\n")[1:] # Skip header
123
- res = display_options(options=formatted_data.split("\n"), msg="📋 Select processes to manage:", fzf=True, multi=True)
123
+ res = choose_from_options(options=formatted_data.split("\n"), msg="📋 Select processes to manage:", fzf=True, multi=True)
124
124
  indices = [options.index(val) for val in res]
125
125
  selected_processes = [self.data[i] for i in indices]
126
126
 
@@ -207,12 +207,12 @@
207
207
  # for a_dir in tasks_dirs:
208
208
  # tasks.append(read_task_from_dir(a_dir))
209
209
 
210
- # from machineconfig.utils.utils import choose_multiple_options
210
+ # from machineconfig.utils.utils import choose_from_options
211
211
 
212
212
  # # Create data for tasks display
213
213
  # task_data = [Report.from_path(path=a_task.report_path).__dict__ for a_task in tasks]
214
214
  # task_display = format_table_markdown(task_data)
215
- # tasks_chosen_raw = choose_multiple_options(task_display.splitlines(), "📋 Choose tasks to run")
215
+ # tasks_chosen_raw = choose_from_options(multi=True, task_display.splitlines(), "📋 Choose tasks to run")
216
216
  # tasks_chosen = [tasks[int(a_task_chosen.split("|")[1])] for a_task_chosen in tasks_chosen_raw]
217
217
 
218
218
  # print(f"""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: machineconfig
3
- Version: 3.5
3
+ Version: 3.8
4
4
  Summary: Dotfiles management package
5
5
  Author-email: Alex Al-Saffar <programmer@usa.com>
6
6
  License: Apache 2.0
@@ -1,7 +1,7 @@
1
1
  machineconfig/__init__.py,sha256=TO5eByMRXNSfiXaDyiDjJpkNBscUUDYXsbe1JGSi5NM,822
2
2
  machineconfig/logger.py,sha256=XLckvZ8cPDpC5v75ESP3YNTputIrDYuvoYisj0YZtGw,1415
3
3
  machineconfig/cluster/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- machineconfig/cluster/remote/cloud_manager.py,sha256=DCkA0XCOrhdBzPJ8M0_V1TuY8Mj7MW82iHr9NN3luxU,26037
4
+ machineconfig/cluster/remote/cloud_manager.py,sha256=8f5mIkAnXNjhVswlv49bEgAGLJIv_e_tNbI_wgPBo0Q,26041
5
5
  machineconfig/cluster/remote/data_transfer.py,sha256=1QxIUetqlhmyl67icBx0nFZEZ7Z2DRjygXofKLMOz-0,4385
6
6
  machineconfig/cluster/remote/distribute.py,sha256=TWnOcTcItu3QQTDP3cNsUprnteYYt7WM7oHpNuoPSFo,15273
7
7
  machineconfig/cluster/remote/file_manager.py,sha256=w1edpBcH8mHDEzRF5tqQDu5MJYsySIQrMCbgN23A4zM,13966
@@ -48,7 +48,7 @@ machineconfig/jobs/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
48
48
  machineconfig/jobs/python/check_installations.py,sha256=o0mrZ-ivdED_7Od1tdtwJ4XSQRfiY6d_HciXLh1PXtY,11126
49
49
  machineconfig/jobs/python/create_bootable_media.py,sha256=KKtcPk0rFLQc4eNVP6nbeYX-P7Gpqi0HvfIcUM6rVVs,827
50
50
  machineconfig/jobs/python/python_cargo_build_share.py,sha256=RDe1QiTH3vLQ1wjN0kE5NxMIqwB-_WHz6O3svyuH_VE,2133
51
- machineconfig/jobs/python/python_ve_symlink.py,sha256=jEqmY53t4LLzHE96qDFPRVAN-fkVtsYjjQFDLVFbY-A,846
51
+ machineconfig/jobs/python/python_ve_symlink.py,sha256=SgLPZGtnhZ8L5ms2zEohQkJAzPeBkI3mB4DBHjAmzN0,850
52
52
  machineconfig/jobs/python/tasks.py,sha256=hrBDQOnBmcXtauTkicVgC8J2AOGcfdFfyx0K8eI6Coc,150
53
53
  machineconfig/jobs/python/vscode/api.py,sha256=YTKWxdRwPI9_1iqUhrUVPeS96aqE9rw1YNhIjBwGWTE,1675
54
54
  machineconfig/jobs/python/vscode/link_ve.py,sha256=1tXXgfWcl18K6avdhm2V7zng18opR9pfI0PSLxMFbiQ,1439
@@ -116,8 +116,8 @@ machineconfig/jobs/windows/archive/openssh-server_copy-ssh-id.ps1,sha256=-7pElYi
116
116
  machineconfig/jobs/windows/msc/cli_agents.bat,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
117
  machineconfig/jobs/windows/msc/cli_agents.ps1,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
118
118
  machineconfig/profile/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
- machineconfig/profile/create.py,sha256=yWAxJ6QNaHurnDVLQ7XUcfjdKMFU9AGV9runVM06mZ4,6463
120
- machineconfig/profile/shell.py,sha256=VjRl9GT20npUrAjWoQoo0DSabD2-bTgk7gAX_4Ycxdo,9207
119
+ machineconfig/profile/create.py,sha256=X0hk-G8TCC1U8qGQSdc-ktQYb9caO2pEjvihFxoH1Hk,6475
120
+ machineconfig/profile/shell.py,sha256=rseM8irNSv8xAUj8pDucjCuuqJZoNtpSgKt9JOntoM0,9215
121
121
  machineconfig/profile/records/generic/shares.toml,sha256=FduDztfyQtZcr5bfx-RSKhEEweweQSWfVXkKWnx8hCY,143
122
122
  machineconfig/profile/records/linux/apps_summary_report.csv,sha256=pw9djvaRUPalKDLn2sl3odcbD2_Zx3aEupsQ8UPfaaY,2738
123
123
  machineconfig/profile/records/linux/apps_summary_report.md,sha256=l77oofA6Rliql0ZgKGIZi8bstFoGyyGTxeS8p2PtOj0,5634
@@ -141,8 +141,8 @@ machineconfig/scripts/linux/fzffg,sha256=jjeeyFkWmBbwH2taRqC3EOzZep2KR-ZYoI4UI-5
141
141
  machineconfig/scripts/linux/fzfg,sha256=ClGnJZUsIk4y0qs3W5iXGo-nd0FaqAHMsnh8uoXQFy8,1190
142
142
  machineconfig/scripts/linux/fzfrga,sha256=xSdws6ae28ZXkkqz_uupZ0MYw_vxE2qpLT2DLS3WITM,460
143
143
  machineconfig/scripts/linux/gh_models,sha256=EMFUmkkYxCx6vP0SUly6OMVRXGfN1wRCInn1ilUC3HM,100
144
+ machineconfig/scripts/linux/initai,sha256=Xk46tiCwa9TFKwMi3SrB1V9al7SJBGy7cU70i5pTNik,97
144
145
  machineconfig/scripts/linux/kill_process,sha256=SqK8zQNkmcQQWD8UzWmqz5T5MaKQvAyzC9ftfMIjfkY,102
145
- machineconfig/scripts/linux/mcinit,sha256=ug-eE6jkkgw3o5r5B5zUqAZUD-XN-rwY6aNxhFj88DM,97
146
146
  machineconfig/scripts/linux/mount_drive,sha256=zemKofv7hOmRN_V3qK0q580GkfWw3VdikyVVQyiu8j8,3514
147
147
  machineconfig/scripts/linux/mount_nfs,sha256=kpIbAse3igReEGgnXngez2ytWucLwmb_xo6e6KeO_rs,1870
148
148
  machineconfig/scripts/linux/mount_nw_drive,sha256=pNzHc7yZn5YIzn2BkpKvd5530PqbestkzrdoXaChyqY,2338
@@ -162,32 +162,32 @@ machineconfig/scripts/linux/warp-cli.sh,sha256=shFFZ9viet_DSEEHT8kxlGRHoJpO6o85p
162
162
  machineconfig/scripts/linux/wifi_conn,sha256=X4TH3OvcVZfOveSbF9WW8uXb4U_G7ZSnCERc7VYAqkc,95
163
163
  machineconfig/scripts/linux/z_ls,sha256=ATZtu0ccN3AKvAOxkwLq1xgQjJ3en5byEWJ3Q8afnNg,3340
164
164
  machineconfig/scripts/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
- machineconfig/scripts/python/choose_wezterm_theme.py,sha256=fDx0cdtsCOCiuiZAHSG9S5ECcgkxSoUdclpU6wdtuC8,3321
165
+ machineconfig/scripts/python/choose_wezterm_theme.py,sha256=Hlu_EOQhLM6wYdAdY25jcqEK11BkVwQYwkz04xnIBVU,3397
166
166
  machineconfig/scripts/python/cloud_copy.py,sha256=d3gBSPBCtNCRDANpzUoCJBM3kHBarwizyZo8dkL_BXQ,8553
167
167
  machineconfig/scripts/python/cloud_manager.py,sha256=MAVOKqXGxnlMaQGEv6k-q_PrgN0at6J8qQDhPiH2lI8,3488
168
- machineconfig/scripts/python/cloud_mount.py,sha256=jG-TCznzQQQOacXZ84LZnMT2jPn0Jro7Ddw6w4Er908,6799
169
- machineconfig/scripts/python/cloud_repo_sync.py,sha256=pVDdOL5gI7ewLq_Fsi9KP1Hxo8uf9NPFGVg_91n170g,9981
168
+ machineconfig/scripts/python/cloud_mount.py,sha256=PLTPC9aH6v5g9lTJ8jFBBxz8ZGAuWo4sRU4FXfd1koA,6816
169
+ machineconfig/scripts/python/cloud_repo_sync.py,sha256=wXrCgZyPldFZAbK4cUsTHID7XIujz-eXdzgc0w6nkfE,10023
170
170
  machineconfig/scripts/python/cloud_sync.py,sha256=RfgrEPGg_LrIaY3hfLDHsK8blrZvyPsoN66X0Z3WeCw,3859
171
- machineconfig/scripts/python/croshell.py,sha256=GP9hrGqtbvS_DBVI6qRDX6V90W9lPRpcZUb3mPnGMBQ,9630
172
- machineconfig/scripts/python/devops.py,sha256=vqZCRVLbzwkT-uDBQKgWmFtMV-ayF7GNgdz9OlrhziQ,6202
173
- machineconfig/scripts/python/devops_add_identity.py,sha256=Bw7dJf5QM2YzFR65X14LRia8GlJSVwFrb0KToI-enEg,4068
174
- machineconfig/scripts/python/devops_add_ssh_key.py,sha256=C6UFYD0L3istfz08uJGWkeePHyy95oqvkxseCcZe9o4,6951
175
- machineconfig/scripts/python/devops_backup_retrieve.py,sha256=-Upfex0UKxBbSg1b5PP77cqQcr8a5a0RzSScMXb1BNY,5597
176
- machineconfig/scripts/python/devops_devapps_install.py,sha256=mF6neipqc2zv7-fZ9iWgX_oWZBrxiizU5vWctXtyKMM,9633
171
+ machineconfig/scripts/python/croshell.py,sha256=8ywivKgbg-2iaeAqrVWx4bKu6jM05pClGB5vCKghoMA,9638
172
+ machineconfig/scripts/python/devops.py,sha256=VJWrRniX2suOi_E4x-6KU4x97TwbfvgXrNm47gjiXfg,6223
173
+ machineconfig/scripts/python/devops_add_identity.py,sha256=JfN3ZrYMCgmt4ks_VCfnV9BIIHAsOYO3E0W0wZ15FR8,3791
174
+ machineconfig/scripts/python/devops_add_ssh_key.py,sha256=KaoX83KltBsmutfKhSfZjd7nP_R1hJ2OLAWRhbswO7o,6889
175
+ machineconfig/scripts/python/devops_backup_retrieve.py,sha256=jZe5Vki7E2GCMG8hvqUZeOONFC4cNzISoGzq_dMG4GA,5601
176
+ machineconfig/scripts/python/devops_devapps_install.py,sha256=QBwBF9EC6kFj-93kNC1YS8N3P4g-eT9yCu0i0OrjYrY,9653
177
177
  machineconfig/scripts/python/devops_update_repos.py,sha256=c5qBc9cuTGDEqDHufkjDT4d_vvJsswv3tlqk9MAulYk,8063
178
178
  machineconfig/scripts/python/dotfile.py,sha256=1a4THWmfGXiJHjWGFf1Qbp6vrMEGIkonIofOcUVic90,2260
179
- machineconfig/scripts/python/fire_agents.py,sha256=hj-4MzSVtMvDK-74hQJAhp2Laq53lPO5FwdYVH9L3mg,9057
179
+ machineconfig/scripts/python/fire_agents.py,sha256=_k1CcPaAp3B7h72tSczFDbLsqTg6FmPDgxxU-GjRHWA,9179
180
180
  machineconfig/scripts/python/fire_agents_help_launch.py,sha256=sTdjNz2pDinDMMjUAMN7OqH-KAUeHh6Aihr_zUvtM6k,6128
181
181
  machineconfig/scripts/python/fire_agents_help_search.py,sha256=qIfSS_su2YJ1Gb0_lu4cbjlJlYMBw0v52NTGiSrGjk8,2991
182
182
  machineconfig/scripts/python/fire_agents_load_balancer.py,sha256=QPiCbQq9j5REHStPdYqQcGNkz_rp5CjotqOpMY3v5TM,2099
183
- machineconfig/scripts/python/fire_jobs.py,sha256=YqW-xnLDaa7obQQ2Vs4V9Wup7dzd18A519xwcbAzfQY,16676
183
+ machineconfig/scripts/python/fire_jobs.py,sha256=Ny0AdZE_ZX-Nq9wAY3T1gfa8Y_aOIR-I21q_Ulk7EcM,16713
184
184
  machineconfig/scripts/python/fire_jobs_args_helper.py,sha256=TfCKSExGZhYrZ6JmXIHsd0wpNSWcKeLeRh9gFR3FG-M,4330
185
- machineconfig/scripts/python/fire_jobs_layout_helper.py,sha256=lVqAglZSI3vmvGi9_71fNlsWpgMPXGCdpJwPUsoSXwM,3230
185
+ machineconfig/scripts/python/fire_jobs_layout_helper.py,sha256=Hj77uKgmNKSEBtnW0oCdRBwdKEuhzPxX1p81mRTBibo,3314
186
186
  machineconfig/scripts/python/fire_jobs_streamlit_helper.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
187
187
  machineconfig/scripts/python/ftpx.py,sha256=VyvfdSa6ee0bMMG24HtBk7ooYeYSZuDUOJ7IkgJkdaU,9920
188
188
  machineconfig/scripts/python/get_zellij_cmd.py,sha256=e35-18hoXM9N3PFbvbizfkNY_-63iMicieWE3TbGcCQ,576
189
189
  machineconfig/scripts/python/gh_models.py,sha256=3BLfW25mBRiPO5VKtVm-nMlKLv-PaZDw7mObajq6F6M,5538
190
- machineconfig/scripts/python/mount_nfs.py,sha256=fTvP2pXgkU82-yc8he_WGI7_trXWEb7H5nsPfN9lsGs,3317
190
+ machineconfig/scripts/python/mount_nfs.py,sha256=c8pWXimDWdgCkSskcnPgT-8ESPosil6Cvy2hGSaIBJE,3359
191
191
  machineconfig/scripts/python/mount_nw_drive.py,sha256=iru6AtnTyvyuk6WxlK5R4lDkuliVpPV5_uBTVVhXtjQ,1550
192
192
  machineconfig/scripts/python/mount_ssh.py,sha256=rGY2pgtlnWMi0Rrge1aCdjtfbULrj2cyaStDoX-y2w4,2236
193
193
  machineconfig/scripts/python/onetimeshare.py,sha256=bmGsNnskym5OWfIhpOfZG5jq3m89FS0a6dF5Sb8LaZM,2539
@@ -199,14 +199,14 @@ machineconfig/scripts/python/repos_helper_update.py,sha256=AYyKIB7eQ48yoYmFjydIh
199
199
  machineconfig/scripts/python/scheduler.py,sha256=7IBjMMOHMkklcWzYwz93EH9XzbJ5uPqU03bJ_lYbRNo,3083
200
200
  machineconfig/scripts/python/snapshot.py,sha256=aDvKeoniZaeTSNv9zWBUajaj2yagAxVdfuvO1_tgq5Y,1026
201
201
  machineconfig/scripts/python/start_slidev.py,sha256=rcvXI5WMYHOqHm90_V8JMnlosFAmakI8591izn-Mq-M,4527
202
- machineconfig/scripts/python/start_terminals.py,sha256=pVf-Qmymevzr0xhDu9um9E0-kSRX8MdDupvGyTMv2Mc,6206
202
+ machineconfig/scripts/python/start_terminals.py,sha256=fNaAPqiOeWsdXvzsbX232Wpgq9a-0DCpi-YLXtTa7nM,6214
203
203
  machineconfig/scripts/python/viewer.py,sha256=heQNjB9fwn3xxbPgMofhv1Lp6Vtkl76YjjexWWBM0pM,2041
204
204
  machineconfig/scripts/python/viewer_template.py,sha256=ve3Q1-iKhCLc0VJijKvAeOYp2xaFOeIOC_XW956GWCc,3944
205
205
  machineconfig/scripts/python/wifi_conn.py,sha256=2FJ4srVthGHsy3KSXpvndAyVkNO8n_XeSgVRnd_PjZA,15576
206
206
  machineconfig/scripts/python/wsl_windows_transfer.py,sha256=ziq-LrTisXgD_gfZ-Bdx_qunB1jnb4Tmzsp2tKrmK1Q,3651
207
207
  machineconfig/scripts/python/ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
208
208
  machineconfig/scripts/python/ai/generate_files.py,sha256=Vfjgd0skJu-WTgqUxmOVFzaNMfSFBaFmY5oGGVY7MZY,2860
209
- machineconfig/scripts/python/ai/mcinit.py,sha256=23YsdZlQ3YpmRAhj4LgLdeNGH5BobNmBJHwF3f4og90,2618
209
+ machineconfig/scripts/python/ai/initai.py,sha256=yATpWMu_yrbhzXS7zP2Dm0Saz27AFktbi-gCGs5kKFc,2618
210
210
  machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh,sha256=hkzP1b92aWPL_qFv5iIoQEXrIbWGI3ZSwsZ83CL1Ios,1976
211
211
  machineconfig/scripts/python/ai/solutions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
212
212
  machineconfig/scripts/python/ai/solutions/_shared.py,sha256=QRT4Doe8aW8ULYq9OrlAIX2nVOLhwXdVuubkgnnSpgU,244
@@ -254,8 +254,8 @@ machineconfig/scripts/windows/fzfg.ps1,sha256=CHJbMrMuZePd4dxwIwz3g4XWAEmWmckuX-
254
254
  machineconfig/scripts/windows/fzfrga.bat,sha256=rU_KBMO6ii2EZ0akMnmDk9vpuhKSUZqkV0o8a8ywXcM,488
255
255
  machineconfig/scripts/windows/gpt.ps1,sha256=Xb6kcwtejVXOodel1jxsGLTf4X-u854zaGL92KuKr5c,78
256
256
  machineconfig/scripts/windows/grep.ps1,sha256=sUP_cXtqPEWLQ8_TdGJX7_-CO6CQYTP4pA-ZmkdPLdY,49
257
+ machineconfig/scripts/windows/initai.ps1,sha256=ht2JQvZ6y_WM3FYvc1tLuxfpscQjOLi3ZE7ETYqPACQ,78
257
258
  machineconfig/scripts/windows/kill_process.ps1,sha256=dHR2HMG6j7jDW0sZ8GfC9UvNsyFx5b2FgARi-ZH2dds,85
258
- machineconfig/scripts/windows/mcinit.ps1,sha256=2W8zdQhFYp1I6OJEdagOqrm-62L-8V-wwGncGHOLiBw,78
259
259
  machineconfig/scripts/windows/mount_nfs.ps1,sha256=mTR-KcOYJaljWzymKTbzj3jrl5EMgS33mHizU-uO7yo,2089
260
260
  machineconfig/scripts/windows/mount_nw.ps1,sha256=puxcfZc3ZCJerm8pj8OZGVoTYkhzp-h7oV-MrksSqIE,454
261
261
  machineconfig/scripts/windows/mount_smb.ps1,sha256=PzYWpIO9BpwXjdWlUQL9pnMRnOGNSkxfh4bHukJFme8,69
@@ -345,7 +345,7 @@ machineconfig/settings/shells/bash/init.sh,sha256=EOCNg7h4roNDTappkddwy7U_0R_NKi
345
345
  machineconfig/settings/shells/hyper/.hyper.js,sha256=h-HqeYlvPvPD4Ee7828Cxo87uVkzbMGJFqXTZIWoegw,8884
346
346
  machineconfig/settings/shells/ipy/profiles/default/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
347
347
  machineconfig/settings/shells/ipy/profiles/default/startup/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
348
- machineconfig/settings/shells/ipy/profiles/default/startup/playext.py,sha256=-RINJ7SH3ieHGw2C1_ENnRitbVM9u26sUYD8kF7I3uQ,3503
348
+ machineconfig/settings/shells/ipy/profiles/default/startup/playext.py,sha256=OJ3NJlhjjNW60tpvMgUYAqO4fKtJ5MsAnlf0CefcLO4,3520
349
349
  machineconfig/settings/shells/kitty/kitty.conf,sha256=lDdx-dUX3jbKGb3BkS2f2TOpmgGiS-CI-_-lFvhD5A4,52870
350
350
  machineconfig/settings/shells/nushell/config.nu,sha256=ug0E0NXNlCzgStScFN6VTsAkUaOTPJZB69P-LS5L2VE,1047
351
351
  machineconfig/settings/shells/nushell/env.nu,sha256=4VmaXb-qP6qnMD5TPzkXMLFNlB5QC4l9HEzCvXZE2GQ,315
@@ -403,12 +403,12 @@ machineconfig/utils/installer.py,sha256=_sjaIqqHN-7n3mYD-iOIli6Bn2792EjOwE-JC528
403
403
  machineconfig/utils/io.py,sha256=6LuQMT7CG26atx5_0P30Ru0zHgLwuvpKHfZLUWIjS-U,2873
404
404
  machineconfig/utils/links.py,sha256=riNUrG8aGElRszdOPOic4M2AyOcpdcth_-y8JEiZpJ4,10253
405
405
  machineconfig/utils/notifications.py,sha256=vvdsY5IX6XEiILTnt5lNyHxhCi0ljdGX2T_67VRfrG4,9009
406
- machineconfig/utils/options.py,sha256=wCP1oN-UFl8CbcCfJ7Orw_Ghy2ZKqNLiolzCGeRVfuk,8535
406
+ machineconfig/utils/options.py,sha256=Fn5Ka3cUtJrJEwjmr0iRrETU6dEtM4y8-lvuYyaSetw,9199
407
407
  machineconfig/utils/path_extended.py,sha256=jqkVr_leG6mQsDBG84Hu0SjMPtJ7jxODryi85c45jXE,52518
408
- machineconfig/utils/path_helper.py,sha256=tULlUJY58VaZfEmqoW3HVjiz7GLEAA9ReZ1moyo01qA,8013
409
- machineconfig/utils/procs.py,sha256=-Se3lKCVX-j8BMhczzO8xXIR_SHLeiTcaRI0AToHDHo,11385
408
+ machineconfig/utils/path_helper.py,sha256=jqOf3TAlw5cqSp4HBAlOqjAR_bzC8_fvjA-_-CooI6Y,8030
409
+ machineconfig/utils/procs.py,sha256=KjEbrwfbdoi5IBM518scxMDVi7NxTZLHuYiKmwdGlzg,11393
410
410
  machineconfig/utils/scheduler.py,sha256=bUHDviS_HE9_6LaA1k9Nnfz5rr2FJIfrk5qO2FJ-oUs,15119
411
- machineconfig/utils/scheduling.py,sha256=8xjeoR_D5QHT0d7299Mgsj6JUbvkE_PX_pWq3myi658,11184
411
+ machineconfig/utils/scheduling.py,sha256=RF1iXJpqf4Dg18jdZWtBixz97KAHC6VKYqTFSpdLWuc,11188
412
412
  machineconfig/utils/source_of_truth.py,sha256=GnjcVkKm11RyZFHGnPbne5YDEBYoZ5yryBNkpfGC7O4,854
413
413
  machineconfig/utils/ssh.py,sha256=zkNUGeijrdoZYkp56DDC8m8LFqPmxQCDNTv5Ns5B7rk,21096
414
414
  machineconfig/utils/terminal.py,sha256=IXYhZ5a0qA6X9CdMT9S7IEKQtJXrDzmiDUGd4C85-oE,12436
@@ -420,13 +420,13 @@ machineconfig/utils/cloud/onedrive/setup_oauth.py,sha256=ZTVkqgrwbV_EoPvyT8dyOTU
420
420
  machineconfig/utils/cloud/onedrive/transaction.py,sha256=m-aNcnWj_gfZVvJOSpkdIqjZxU_3nXx2CA-qKbQgP3I,26232
421
421
  machineconfig/utils/installer_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
422
422
  machineconfig/utils/installer_utils/installer_abc.py,sha256=iB1_PZLQGouCdEA8bixdB4kZAQ2OnPqZeRcwaf4LzuI,5178
423
- machineconfig/utils/installer_utils/installer_class.py,sha256=2kuj3HpIuCo7a-yCWc3sT-1788IALpFti0BGPFU6NzU,20348
423
+ machineconfig/utils/installer_utils/installer_class.py,sha256=P3ZKr92b0ofbQCJUyK3eU3FVgK1ZMRw36WH-rbR5pAw,20430
424
424
  machineconfig/utils/schemas/fire_agents/fire_agents_input.py,sha256=CCs5ebomW1acKWZRpv9dyDzM-W6pwvVplikcutE2D8I,2339
425
425
  machineconfig/utils/schemas/installer/installer_types.py,sha256=iAzcALc9z_FAQE9iuGHfX6Z0B1_n3Gt6eC0d6heYik0,599
426
426
  machineconfig/utils/schemas/layouts/layout_types.py,sha256=OmiOX9xtakPz4l6IobWnpFHpbn95fitEE9q0YL1WxjQ,617
427
427
  machineconfig/utils/schemas/repos/repos_types.py,sha256=ECVr-3IVIo8yjmYmVXX2mnDDN1SLSwvQIhx4KDDQHBQ,405
428
- machineconfig-3.5.dist-info/METADATA,sha256=0FCRbanj5qPkifFEhI8LO8XmOFloF2jqHNsRX6SQ7bU,6963
429
- machineconfig-3.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
430
- machineconfig-3.5.dist-info/entry_points.txt,sha256=nBemaVdIfKeDNH11op15aSDIqP_nWxas8JSm0XFoidc,1023
431
- machineconfig-3.5.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
432
- machineconfig-3.5.dist-info/RECORD,,
428
+ machineconfig-3.8.dist-info/METADATA,sha256=eMF7Wf25jy644UorB76cz5tokYUdYvgwHmo4Q2RMS9M,6963
429
+ machineconfig-3.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
430
+ machineconfig-3.8.dist-info/entry_points.txt,sha256=gFSet9HBtk9WbSZcZ8Scv1k3CKibx_mKjySBGZ2tqbU,1023
431
+ machineconfig-3.8.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
432
+ machineconfig-3.8.dist-info/RECORD,,
@@ -9,8 +9,8 @@ devops = machineconfig.scripts.python.devops:args_parser
9
9
  fire = machineconfig.scripts.python.fire_jobs:main
10
10
  fire_agents = machineconfig.scripts.python.fire_agents:main
11
11
  ftpx = machineconfig.scripts.python.ftpx:main
12
+ initai = machineconfig.scripts.python.ai.initai:main
12
13
  kill_process = machineconfig.utils.procs:main
13
- mcinit = machineconfig.scripts.python.ai.mcinit:main
14
14
  mount_nfs = machineconfig.scripts.python.mount_nfs:main
15
15
  mount_nw_drive = machineconfig.scripts.python.mount_nw_drive:main
16
16
  repos = machineconfig.scripts.python.repos:main