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

@@ -146,9 +146,12 @@ PACKAGES_NAMES_ESSENTIAL = Literal[
146
146
  "zoxide",
147
147
  ]
148
148
 
149
- PACKAGE_GROUPS: TypeAlias = Literal["ESSENTIAL", "DEV"]
149
+ PACKAGE_GROUPS: TypeAlias = Literal["ESSENTIAL", "DEV", "ESSENTIAL_SYSTEM", "DEV_SYSTEM"]
150
150
  PACKAGE_GROUP2NAMES: dict[PACKAGE_GROUPS, list[str]] = {
151
151
  "ESSENTIAL": list(PACKAGES_NAMES_ESSENTIAL.__args__),
152
152
  "DEV": list(PACKAGES_NAMES_DEV.__args__),
153
+ "ESSENTIAL_SYSTEM": [],
154
+ "DEV_SYSTEM": [],
153
155
  }
156
+
154
157
  _ = Union
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env bash
2
+ uv run --python 3.13 --no-dev --project $HOME/code/machineconfig agents "$@"
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env bash
2
+ uv run --python 3.13 --no-dev --project $HOME/code/machineconfig sessions "$@"
@@ -193,5 +193,12 @@ fire_agents collect $AGENTS_DIR "$REPO_ROOT/.ai/agents/$JOB_NAME/collected.txt"
193
193
  typer.echo(f"Template bash script written to {save_path}")
194
194
 
195
195
 
196
+ def main_from_parser():
197
+ agents_app = typer.Typer(help="🤖 AI Agents management subcommands")
198
+ agents_app.command("create")(create)
199
+ agents_app.command("collect")(collect)
200
+ agents_app.command("template")(template)
201
+ return agents_app()
202
+
196
203
  if __name__ == "__main__": # pragma: no cover
197
204
  pass
@@ -10,10 +10,10 @@ from machineconfig.utils.path_extended import PathExtended as PathExtended
10
10
  from machineconfig.utils.accessories import randstr
11
11
 
12
12
  from machineconfig.utils.options import choose_from_options
13
- from machineconfig.utils.ve import get_ve_activate_line
13
+ # from machineconfig.utils.ve import get_ve_activate_line
14
14
  from rich.console import Console
15
15
  from rich.panel import Panel
16
- from rich.text import Text
16
+ # from rich.text import Text
17
17
 
18
18
  console = Console()
19
19
 
@@ -173,41 +173,27 @@ print(f"🐊 Crocodile Shell | Running @ {Path.cwd()}")
173
173
  title = "Running Python File"
174
174
  else:
175
175
  title = "Executed code"
176
- total_program = preprogram + add_print_header_pycode(str(pyfile), title=title) + program
177
-
178
- pyfile.write_text(total_program, encoding="utf-8")
179
-
176
+ python_program = preprogram + add_print_header_pycode(str(pyfile), title=title) + program
177
+ pyfile.write_text(python_program, encoding="utf-8")
180
178
  # ve_root_from_file, ipython_profile = get_ve_path_and_ipython_profile(PathExtended(file))
181
179
  ipython_profile = ipython_profile if ipython_profile is not None else "default"
182
180
  # ve_activateion_line = get_ve_activate_line(ve_name=args.ve or ve_profile_suggested, a_path=str(PathExtended.cwd()))
183
- activate_ve_line = get_ve_activate_line(ve_root="$HOME/code/machineconfig/.venv")
184
- final_program = f"""
181
+ shell_program = """
185
182
  #!/bin/bash
186
183
 
187
- {activate_ve_line}
188
-
189
184
  """
190
185
  if jupyter:
191
186
  fire_line = f"code --new-window {str(pyfile)}"
192
187
  else:
193
- fire_line = interpreter
194
- if interpreter == "ipython":
195
- fire_line += f" {interactivity} --profile {ipython_profile} --no-banner"
196
- fire_line += f" {str(pyfile)}"
197
-
198
- final_program += fire_line
199
-
200
- title = "🚀 LAUNCHING SCRIPT"
201
- text1 = f"📄 Script: {pyfile}"
202
- text2 = f"🔥 Command: {fire_line}"
203
- launch_message = f"{title} \n{text1}\n{text2}"
204
- console.print(Panel(Text(launch_message, justify="left"), expand=False, border_style="blue"))
205
-
206
- # PROGRAM_PATH.write_text(data=final_program, encoding="utf-8")
207
- # (PROGRAM_PATH + ".py").write_text(str(pyfile), encoding='utf-8')
188
+ fire_line = f"uv run --project $HOME/code/machineconfig/.venv {interpreter} {interactivity} "
189
+ if interpreter == "ipython": fire_line += f" --profile {ipython_profile} --no-banner"
190
+ fire_line += " " + str(pyfile)
191
+ shell_program += fire_line
192
+ from rich.syntax import Syntax
193
+ console.print(Syntax(shell_program, lexer="bash"))
194
+ print()
208
195
  import subprocess
209
-
210
- subprocess.run(final_program, shell=True, check=True)
196
+ subprocess.run(shell_program, shell=True, check=True)
211
197
 
212
198
 
213
199
  def arg_parser() -> None:
@@ -1,7 +1,5 @@
1
1
  """devops with emojis"""
2
2
 
3
- import machineconfig.scripts.python.fire_agents as fire_agents
4
- import machineconfig.scripts.python.fire_jobs_layout_helper as fire_jobs_layout_helper
5
3
  import machineconfig.scripts.python.devops_devapps_install as installer_entry_point
6
4
  import machineconfig.scripts.python.share_terminal as share_terminal
7
5
  import machineconfig.scripts.python.repos as repos
@@ -10,17 +8,6 @@ import typer
10
8
 
11
9
  app = typer.Typer(help="🛠️ DevOps operations with emojis", no_args_is_help=True)
12
10
 
13
-
14
- agents_app = typer.Typer(help="🤖 AI Agents management subcommands")
15
- agents_app.command("create")(fire_agents.create)
16
- agents_app.command("collect")(fire_agents.collect)
17
- app.add_typer(agents_app, name="agents")
18
-
19
- layouts_app = typer.Typer(help="Layouts management subcommands")
20
- layouts_app.command("launch")(fire_jobs_layout_helper.launch)
21
- layouts_app.command("load-balance")(fire_jobs_layout_helper.load_balance)
22
- app.add_typer(layouts_app, name="session")
23
-
24
11
  app.command(name="install", help="📦 Install essential packages")(installer_entry_point.main)
25
12
  app.command(name="share-terminal", help="📡 Share terminal via web browser")(share_terminal.main)
26
13
  app.command(name="repos", help="📁 Manage git repositories")(repos.main)
@@ -1,33 +1,29 @@
1
1
  """Devops Devapps Install"""
2
2
 
3
+ from machineconfig.utils.installer import get_installers_system_groups
3
4
  import typer
4
5
  from rich.progress import Progress, SpinnerColumn, TextColumn
5
6
  from rich.console import Console
6
7
  from rich.panel import Panel
7
8
  from rich.table import Table
8
9
  from platform import system
9
- from typing import Optional, Literal, TypeAlias, cast, get_args, Annotated
10
+ from typing import Optional, cast, get_args
11
+ from machineconfig.jobs.installer.package_groups import PACKAGE_GROUPS
10
12
 
11
13
  console = Console()
12
14
 
13
- WHICH_CAT: TypeAlias = Literal["essentials", "essentialsDev", "systemPackages", "precheckedPackages", "ia"]
14
-
15
15
 
16
16
  def _handle_installer_not_found(search_term: str, all_installers: list["InstallerData"]) -> None: # type: ignore
17
17
  """Handle installer not found with friendly suggestions using fuzzy matching."""
18
18
  from difflib import get_close_matches
19
-
20
- # Get all possible names (both exe names and app names)
19
+
21
20
  all_names = []
22
21
  for inst in all_installers:
23
22
  exe_name = inst["appName"]
24
23
  all_names.append(exe_name)
25
-
26
- # Find close matches using fuzzy matching
27
24
  close_matches = get_close_matches(search_term, all_names, n=5, cutoff=0.4)
28
-
29
25
  console.print(f"\n❌ '[red]{search_term}[/red]' was not found.", style="bold")
30
-
26
+
31
27
  if close_matches:
32
28
  console.print("🤔 Did you mean one of these?", style="yellow")
33
29
  table = Table(show_header=False, box=None, pad_edge=False)
@@ -40,64 +36,44 @@ def _handle_installer_not_found(search_term: str, all_installers: list["Installe
40
36
  sample_names = []
41
37
  for inst in all_installers[:10]:
42
38
  exe_name = inst["appName"]
43
- sample_names.append(exe_name)
44
-
39
+ sample_names.append(exe_name)
40
+
45
41
  table = Table(show_header=False, box=None, pad_edge=False)
46
42
  for i, name in enumerate(sample_names, 1):
47
43
  table.add_row(f"[cyan]{i}.[/cyan]", f"[green]{name}[/green]")
48
44
  console.print(table)
49
-
45
+
50
46
  if len(all_installers) > 10:
51
47
  console.print(f" [dim]... and {len(all_installers) - 10} more[/dim]")
52
-
48
+
53
49
  panel = Panel(
54
- "[bold blue]💡 Use 'ia' to interactively browse all available installers.[/bold blue]\n"
55
- f"[bold blue]💡 Use one of the categories: {list(get_args(WHICH_CAT))}[/bold blue]",
56
- title="[yellow]Helpful Tips[/yellow]",
57
- border_style="yellow"
50
+ f"[bold blue]💡 Use 'ia' to interactively browse all available installers.[/bold blue]\n[bold blue]💡 Use one of the categories: {list(get_args(PACKAGE_GROUPS))}[/bold blue]", title="[yellow]Helpful Tips[/yellow]", border_style="yellow"
58
51
  )
59
52
  console.print(panel)
60
53
 
61
54
 
62
55
  def main_with_parser():
63
56
  import typer
57
+
64
58
  app = typer.Typer()
65
59
  app.command()(main)
66
60
  app()
67
61
 
68
62
 
69
- def main(which: Annotated[Optional[str], typer.Argument(help=f"Choose a category or program to install, {list(get_args(WHICH_CAT))} or <program_name> or list of programs names separated by comma.")]) -> None:
70
- if which in get_args(WHICH_CAT): # install by category
71
- return get_programs_by_category(program_name=which) # type: ignore
72
- from machineconfig.utils.schemas.installer.installer_types import get_normalized_arch, get_os_name
73
- from machineconfig.utils.installer import get_installers
74
- from machineconfig.utils.installer_utils.installer_class import Installer
75
- if which != "ia" and which is not None: # install by name
76
- total_messages: list[str] = []
77
- for a_which in which.split(",") if type(which) == str else which:
78
- all_installers = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=["ESSENTIAL", "DEV"])
79
-
80
- # Find installer by exe_name or name
81
- selected_installer = None
82
- for installer in all_installers:
83
- exe_name = installer["appName"]
84
- app_name = installer["appName"]
85
- if exe_name == a_which or app_name == a_which:
86
- selected_installer = installer
87
- break
88
-
89
- if selected_installer is None:
90
- _handle_installer_not_found(a_which, all_installers)
91
- return None
92
- message = Installer(selected_installer).install_robust(version=None) # finish the task
93
- total_messages.append(message)
94
-
95
- if total_messages:
96
- console.print("\n[bold green]📊 Installation Results:[/bold green]")
97
- for a_message in total_messages:
98
- console.print(f"[blue]• {a_message}[/blue]")
99
- return None
100
-
63
+ def main(
64
+ which: Optional[str] = typer.Option(None, "--which", "-w", help="Comma-separated list of program names to install."),
65
+ group: Optional[PACKAGE_GROUPS] = typer.Option(None, "--group", "-g", help=f"Group name (one of {list(get_args(PACKAGE_GROUPS))})"),
66
+ interactive: bool = typer.Option(False, "--interactive", "-ia", help="Interactive selection of programs to install."),
67
+ ) -> None:
68
+ if which is not None:
69
+ return install_clis(clis_names=[x.strip() for x in which.split(",") if x.strip() != ""])
70
+ if group is not None:
71
+ return get_programs_by_category(package_group=group)
72
+ if interactive:
73
+ return install_interactively()
74
+ typer.echo("❌ You must provide either --which, --group, or --interactive/-ia option.")
75
+ # typer.help(main)
76
+ raise typer.Exit(1)
101
77
 
102
78
 
103
79
  def install_interactively():
@@ -106,118 +82,130 @@ def install_interactively():
106
82
  from machineconfig.utils.installer import get_installers
107
83
  from machineconfig.utils.installer_utils.installer_class import Installer
108
84
  installers = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=["ESSENTIAL", "DEV"])
109
- with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress:
110
- task = progress.add_task("✅ Checking installed programs...", total=len(installers))
111
- installer_options = []
112
- for x in installers:
113
- installer_options.append(Installer(installer_data=x).get_description())
114
- progress.update(task, advance=1)
115
- category_options = [f"📦 {cat}" for cat in get_args(WHICH_CAT)]
116
- options = category_options + ["─" * 50] + installer_options
85
+ installer_options = []
86
+ for x in installers:
87
+ installer_options.append(Installer(installer_data=x).get_description())
88
+ category_options = [f"📦 {cat}" for cat in get_args(PACKAGE_GROUPS)]
89
+ options = category_options + ["─" * 50] + installer_options
117
90
  program_names = choose_from_options(multi=True, msg="Categories are prefixed with 📦", options=options, header="🚀 CHOOSE DEV APP OR CATEGORY", default="📦 essentials", fzf=True)
118
91
  installation_messages: list[str] = []
119
92
  for _an_idx, a_program_name in enumerate(program_names):
120
- if a_program_name.startswith("─"):
93
+ if a_program_name.startswith("─"): # 50 dashes separator
121
94
  continue
122
95
  if a_program_name.startswith("📦 "):
123
96
  category_name = a_program_name[2:] # Remove "📦 " prefix
124
- if category_name in get_args(WHICH_CAT):
125
- get_programs_by_category(program_name=cast(WHICH_CAT, category_name))
97
+ if category_name in get_args(PACKAGE_GROUPS):
98
+ get_programs_by_category(package_group=cast(PACKAGE_GROUPS, category_name))
126
99
  else:
127
100
  installer_idx = installer_options.index(a_program_name)
128
101
  an_installer_data = installers[installer_idx]
129
102
  status_message = Installer(an_installer_data).install_robust(version=None) # finish the task - this returns a status message, not a command
130
103
  installation_messages.append(status_message)
131
104
  if installation_messages:
132
- panel = Panel(
133
- "\n".join([f"[blue]• {message}[/blue]" for message in installation_messages]),
134
- title="[bold green]📊 Installation Summary[/bold green]",
135
- border_style="green",
136
- padding=(1, 2)
137
- )
105
+ panel = Panel("\n".join([f"[blue]• {message}[/blue]" for message in installation_messages]), title="[bold green]📊 Installation Summary[/bold green]", border_style="green", padding=(1, 2))
138
106
  console.print(panel)
139
107
 
140
108
 
141
- def get_programs_by_category(program_name: WHICH_CAT):
142
- panel = Panel(
143
- f"[bold yellow]Installing programs from category: [green]{program_name}[/green][/bold yellow]",
144
- title="[bold blue]📦 Category Installation[/bold blue]",
145
- border_style="blue",
146
- padding=(1, 2)
147
- )
109
+ def get_programs_by_category(package_group: PACKAGE_GROUPS):
110
+ panel = Panel(f"[bold yellow]Installing programs from category: [green]{package_group}[/green][/bold yellow]", title="[bold blue]📦 Category Installation[/bold blue]", border_style="blue", padding=(1, 2))
148
111
  console.print(panel)
149
- from machineconfig.utils.source_of_truth import LIBRARY_ROOT
150
112
  from machineconfig.utils.installer import get_installers, install_all
151
- from machineconfig.utils.installer_utils.installer_abc import parse_apps_installer_linux, parse_apps_installer_windows
152
113
  from machineconfig.utils.schemas.installer.installer_types import get_normalized_arch, get_os_name
153
- from machineconfig.utils.options import choose_from_options
154
- match program_name:
155
- case "essentials":
114
+ match package_group:
115
+ case "ESSENTIAL":
156
116
  installers_ = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=["ESSENTIAL"])
157
117
  install_all(installers_data=installers_)
158
- case "essentialsDev":
118
+ case "DEV":
159
119
  installers_ = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=["DEV", "ESSENTIAL"])
160
120
  install_all(installers_data=installers_)
161
- case "systemPackages":
162
- if system() == "Windows":
163
- options_system = parse_apps_installer_windows(LIBRARY_ROOT.joinpath("setup_windows/apps.ps1").read_text(encoding="utf-8"))
164
- elif system() == "Linux":
165
- options_system = parse_apps_installer_linux(LIBRARY_ROOT.joinpath("setup_linux/apps.sh").read_text(encoding="utf-8"))
166
- else:
167
- raise NotImplementedError(f"❌ System {system()} not supported")
168
-
169
- # Create display options that include descriptions for user selection
170
- display_options = []
171
- for group_name, (description, _) in options_system.items():
172
- if description:
173
- display_options.append(f"{group_name:<20} - {description}")
174
- else:
175
- display_options.append(group_name)
176
-
177
- program_names = choose_from_options(multi=True, msg="", options=sorted(display_options), header="🚀 CHOOSE DEV APP", fzf=True)
178
- program = ""
179
- for display_name in program_names:
180
- # Extract the actual group name (everything before " - " if present)
181
- group_name = display_name.split(" - ")[0].strip() if " - " in display_name else display_name.strip()
182
-
183
- console.print(f"\n[bold cyan]⚙️ Installing: [yellow]{group_name}[/yellow][/bold cyan]", style="bold")
184
-
185
- _, sub_program = options_system[group_name] # Extract content from tuple
186
- if sub_program.startswith("#winget"):
187
- sub_program = sub_program[1:]
188
- program += "\n" + sub_program
189
- from pathlib import Path
190
- if system() == "Windows":
191
- temp_script_path = Path("C:/Windows/Temp/temp_install_script.ps1")
192
- lexer = "powershell"
193
- else:
194
- temp_script_path = Path("/tmp/temp_install_script.sh")
195
- lexer = "bash"
196
- temp_script_path.write_text(program, encoding="utf-8")
197
- console.print(f"📝 [blue]Temporary script written to:[/blue] [green]{temp_script_path}[/green]")
198
- from rich.syntax import Syntax
199
- console.print(Panel(Syntax(code=program, lexer=lexer), title="📄 Installation Program", subtitle="shell code"), style="bold red")
200
- console.print("🚀 [bold yellow]Starting installation...[/bold yellow]")
201
- if system() == "Windows":
202
- import subprocess
203
- subprocess.run(["powershell", "-ExecutionPolicy", "Bypass", "-File", str(temp_script_path)], check=True)
204
- elif system() == "Linux":
205
- import subprocess
206
- subprocess.run(["bash", str(temp_script_path)], check=True)
207
- console.print("✅ [bold green]Installation completed.[/bold green]")
208
- temp_script_path.unlink(missing_ok=True)
209
- case "ia":
210
- install_interactively()
211
- case "precheckedPackages":
212
- # from machineconfig.jobs.python.check_installations import precheckedPackages
213
- # ci = precheckedPackages()
214
- # ci.download_safe_apps(name="essentials")
215
- # program = ""
216
- raise NotImplementedError("precheckedPackages is not implemented yet.")
121
+ case "DEV_SYSTEM" | "ESSENTIAL_SYSTEM":
122
+ options_system = get_installers_system_groups()
123
+ from machineconfig.utils.schemas.installer.installer_types import get_normalized_arch, get_os_name
124
+ for an_item in options_system:
125
+ if an_item["appName"] == package_group:
126
+ program = an_item["fileNamePattern"][get_normalized_arch()][get_os_name()]
127
+ if program is not None:
128
+ install_terminal_packages(program)
129
+
130
+
131
+ def choose_from_system_package_groups(options_system: dict[str, tuple[str, str]]) -> str:
132
+ from machineconfig.utils.options import choose_from_options
133
+ display_options = []
134
+ for group_name, (description, _) in options_system.items():
135
+ if description:
136
+ display_options.append(f"{group_name:<20} - {description}")
137
+ else:
138
+ display_options.append(group_name)
139
+ program_names = choose_from_options(multi=True, msg="", options=sorted(display_options), header="🚀 CHOOSE DEV APP", fzf=True)
140
+ program = ""
141
+ for display_name in program_names:
142
+ # Extract the actual group name (everything before " - " if present)
143
+ group_name = display_name.split(" - ")[0].strip() if " - " in display_name else display_name.strip()
144
+ console.print(f"\n[bold cyan]⚙️ Installing: [yellow]{group_name}[/yellow][/bold cyan]", style="bold")
145
+ _, sub_program = options_system[group_name] # Extract content from tuple
146
+ if sub_program.startswith("#winget"):
147
+ sub_program = sub_program[1:]
148
+ program += "\n" + sub_program
149
+ return program
150
+
151
+
152
+ def install_terminal_packages(program: str):
153
+ from pathlib import Path
154
+
155
+ if system() == "Windows":
156
+ temp_script_path = Path("C:/Windows/Temp/temp_install_script.ps1")
157
+ lexer = "powershell"
158
+ else:
159
+ temp_script_path = Path("/tmp/temp_install_script.sh")
160
+ lexer = "bash"
161
+ temp_script_path.write_text(program, encoding="utf-8")
162
+ console.print(f"📝 [blue]Temporary script written to:[/blue] [green]{temp_script_path}[/green]")
163
+ from rich.syntax import Syntax
164
+
165
+ console.print(Panel(Syntax(code=program, lexer=lexer), title="📄 Installation Program", subtitle="shell code"), style="bold red")
166
+ console.print("🚀 [bold yellow]Starting installation...[/bold yellow]")
167
+ if system() == "Windows":
168
+ import subprocess
169
+
170
+ subprocess.run(["powershell", "-ExecutionPolicy", "Bypass", "-File", str(temp_script_path)], check=True)
171
+ elif system() == "Linux":
172
+ import subprocess
173
+
174
+ subprocess.run(["bash", str(temp_script_path)], check=True)
175
+ console.print("✅ [bold green]Installation completed.[/bold green]")
176
+ temp_script_path.unlink(missing_ok=True)
177
+
178
+
179
+ def install_clis(clis_names: list[str]):
180
+ from machineconfig.utils.schemas.installer.installer_types import get_normalized_arch, get_os_name
181
+ from machineconfig.utils.installer import get_installers
182
+ from machineconfig.utils.installer_utils.installer_class import Installer
183
+
184
+ total_messages: list[str] = []
185
+ for a_which in clis_names:
186
+ all_installers = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=["ESSENTIAL", "DEV"])
187
+ selected_installer = None
188
+ for installer in all_installers:
189
+ exe_name = installer["appName"]
190
+ app_name = installer["appName"]
191
+ if exe_name == a_which or app_name == a_which:
192
+ selected_installer = installer
193
+ break
194
+ if selected_installer is None:
195
+ _handle_installer_not_found(a_which, all_installers)
196
+ return None
197
+ message = Installer(selected_installer).install_robust(version=None) # finish the task
198
+ total_messages.append(message)
199
+ if total_messages:
200
+ console.print("\n[bold green]📊 Installation Results:[/bold green]")
201
+ for a_message in total_messages:
202
+ console.print(f"[blue]• {a_message}[/blue]")
203
+ return None
217
204
 
218
205
 
219
206
  if __name__ == "__main__":
220
207
  from machineconfig.utils.schemas.installer.installer_types import InstallerData
221
208
  from machineconfig.utils.installer_utils.installer_class import Installer
209
+
222
210
  _ = InstallerData, Installer
223
211
  pass
@@ -21,6 +21,7 @@ import subprocess
21
21
  import sys
22
22
  from pathlib import Path
23
23
  from platform import system
24
+ from typing import cast
24
25
 
25
26
  import questionary
26
27
  from questionary import Choice
@@ -29,6 +30,7 @@ from rich.panel import Panel
29
30
  from rich.text import Text
30
31
 
31
32
 
33
+ _ = cast
32
34
  console = Console()
33
35
 
34
36
 
@@ -102,16 +104,16 @@ def install_windows_desktop_apps() -> bool:
102
104
  def get_installation_choices() -> list[str]:
103
105
  """Get user choices for installation options."""
104
106
  choices = [
105
- Choice(value="install_apps", title="📥 Install Apps - Install base system applications", checked=False),
106
107
  Choice(value="upgrade_system", title="🔄 Upgrade System Packages - Update all system packages", checked=False),
107
- Choice(value="install_uv_repos", title="🐍 Install Repos - Set up Python environment and repositories permanently.", checked=False),
108
+ Choice(value="ESSENTIAL_SYSTEM", title="📥 Install Apps - Install base system applications", checked=False),
109
+ Choice(value="ESSENTIAL", title="⚡ Install CLI Apps - Command-line tools installation", checked=False),
110
+ Choice(value="DEV_SYSTEM", title="🛠️ Install Development Tools - rust, libssl-dev, ffmpeg, wezterm, brave, code", checked=False),
111
+ Choice(value="TerminalEyeCandy", title="🎨 Install ASCII Art Libraries - Terminal visualization tools", checked=False),
112
+ Choice(value="install_repos", title="🐍 Install Repos - Set up Python environment and repositories permanently.", checked=False),
108
113
  Choice(value="install_ssh_server", title="🔒 Install SSH Server - Set up remote access", checked=False),
109
114
  Choice(value="create_symlinks", title="🔗 Create Symlinks - Set up configuration symlinks (finish dotfiles transfer first)", checked=False),
110
- Choice(value="install_cli_apps", title="⚡ Install CLI Apps - Command-line tools installation", checked=False),
111
- Choice(value="install_dev_tools", title="🛠️ Install Development Tools - rust, libssl-dev, ffmpeg, wezterm, brave, code", checked=False),
112
115
  Choice(value="retrieve_repositories", title="📚 Retrieve Repositories - Clone repositories to ~/code", checked=False),
113
116
  Choice(value="retrieve_data", title="💾 Retrieve Data - Backup restoration", checked=False),
114
- Choice(value="install_ascii_art", title="🎨 Install ASCII Art Libraries - Terminal visualization tools", checked=False),
115
117
  ]
116
118
  # Add Windows-specific options
117
119
  if system() == "Windows":
@@ -126,18 +128,18 @@ def execute_installations(selected_options: list[str]) -> None:
126
128
  console.print(Panel("🐍 [bold green]PYTHON ENVIRONMENT[/bold green]\n[italic]Setting up base virtual environment[/italic]", border_style="green"))
127
129
  run_command("curl https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/setup_linux/ve.sh | bash", "Setting up base virtual environment")
128
130
 
129
- if "install_apps" in selected_options:
130
- console.print(Panel("📦 [bold blue]APPLICATIONS[/bold blue]\n[italic]Installing base system applications[/italic]", border_style="blue"))
131
- if system() == "Windows":
132
- # Windows: Use PowerShell to execute local apps.ps1 script
133
- from machineconfig import setup_windows as module
134
- script = Path(module.__file__).parent / "apps.ps1"
135
- run_command(f'powershell -ExecutionPolicy Bypass -File "{script}"', "Installing Windows applications")
136
- else:
137
- # Linux: Use existing bash script approach
138
- from machineconfig import setup_linux as module
139
- script = Path(module.__file__).parent / "apps.sh"
140
- run_command(f"bash {script}", "Installing Linux base system applications")
131
+ for maybe_a_group in selected_options:
132
+ if maybe_a_group in ("ESSENTIAL", "DEV", "ESSENTIAL_SYSTEM", "DEV_SYSTEM", "TerminalEyeCandy"):
133
+ console.print(Panel("⚡ [bold bright_yellow]CLI APPLICATIONS[/bold bright_yellow]\n[italic]Command-line tools installation[/italic]", border_style="bright_yellow"))
134
+ console.print("🔧 Installing CLI applications", style="bold cyan")
135
+ try:
136
+ from machineconfig.scripts.python.devops_devapps_install import main as devops_devapps_install_main
137
+ # maybe_a_group = cast(PA, maybe_a_group)
138
+ devops_devapps_install_main(group=maybe_a_group) # type: ignore
139
+ console.print("✅ CLI applications installed successfully", style="bold green")
140
+ except Exception as e:
141
+ console.print(f"❌ Error installing CLI applications: {e}", style="bold red")
142
+ run_command(". $HOME/.bashrc", "Reloading bash configuration")
141
143
 
142
144
  if "upgrade_system" in selected_options:
143
145
  if system() == "Windows":
@@ -147,7 +149,7 @@ def execute_installations(selected_options: list[str]) -> None:
147
149
  run_command("sudo nala upgrade -y", "Upgrading system packages")
148
150
  else:
149
151
  console.print(f"❌ System upgrade not supported on {system()}.", style="bold red")
150
- if "install_uv_repos" in selected_options:
152
+ if "install_repos" in selected_options:
151
153
  console.print(Panel("🐍 [bold green]PYTHON ENVIRONMENT[/bold green]\n[italic]Virtual environment setup[/italic]", border_style="green"))
152
154
  from machineconfig import setup_linux as module
153
155
  script = Path(module.__file__).parent / "repos.sh"
@@ -181,27 +183,6 @@ Set-Service -Name sshd -StartupType 'Automatic'"""
181
183
  else:
182
184
  console.print("⏭️ Skipping symlink creation - finish dotfiles transfer first", style="yellow")
183
185
 
184
- if "install_cli_apps" in selected_options:
185
- console.print(Panel("⚡ [bold bright_yellow]CLI APPLICATIONS[/bold bright_yellow]\n[italic]Command-line tools installation[/italic]", border_style="bright_yellow"))
186
- console.print("🔧 Installing CLI applications", style="bold cyan")
187
- try:
188
- from machineconfig.scripts.python.devops_devapps_install import main as devops_devapps_install_main
189
- devops_devapps_install_main(which="essentials")
190
- console.print("✅ CLI applications installed successfully", style="bold green")
191
- except Exception as e:
192
- console.print(f"❌ Error installing CLI applications: {e}", style="bold red")
193
- run_command(". $HOME/.bashrc", "Reloading bash configuration")
194
-
195
- if "install_dev_tools" in selected_options:
196
- console.print(Panel("🛠️ [bold bright_blue]DEVELOPMENT TOOLS[/bold bright_blue]\n[italic]Software development packages[/italic]", border_style="bright_blue"))
197
- console.print("🔧 Installing development applications", style="bold cyan")
198
- try:
199
- from machineconfig.scripts.python.devops_devapps_install import main as devops_devapps_install_main
200
- devops_devapps_install_main(which="wezterm,brave,code")
201
- console.print("✅ Development applications installed successfully", style="bold green")
202
- except Exception as e:
203
- console.print(f"❌ Error installing development applications: {e}", style="bold red")
204
-
205
186
  if "retrieve_repositories" in selected_options:
206
187
  console.print(Panel("📚 [bold bright_magenta]REPOSITORIES[/bold bright_magenta]\n[italic]Project code retrieval[/italic]", border_style="bright_magenta"))
207
188
  from machineconfig.scripts.python import repos as module
@@ -217,12 +198,6 @@ Set-Service -Name sshd -StartupType 'Automatic'"""
217
198
  except Exception as e:
218
199
  console.print(f"❌ Error retrieving backup data: {e}", style="bold red")
219
200
 
220
- if "install_ascii_art" in selected_options:
221
- console.print(Panel("🎨 [bold bright_green]ASCII ART[/bold bright_green]\n[italic]Terminal visualization tools[/italic]", border_style="bright_green"))
222
- from machineconfig import setup_linux as module
223
- script = Path(module.__file__).parent / "web_shortcuts" / "ascii_art.sh"
224
- run_command(f"bash {script}", "Installing ASCII art libraries")
225
-
226
201
  if "install_windows_desktop" in selected_options:
227
202
  install_windows_desktop_apps()
228
203
 
@@ -127,5 +127,12 @@ def launch(layout_path: str = typer.Argument(..., help="Path to the layout.json
127
127
  print(f"❌ Unsupported platform: {platform.system()}")
128
128
 
129
129
 
130
+ def main_from_parser():
131
+ layouts_app = typer.Typer(help="Layouts management subcommands")
132
+ layouts_app.command("launch")(launch)
133
+ layouts_app.command("load-balance")(load_balance)
134
+ return layouts_app()
135
+
136
+
130
137
  if __name__ == "__main__":
131
138
  from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
@@ -1,6 +1,7 @@
1
1
  """package manager"""
2
2
 
3
- from machineconfig.utils.installer_utils.installer_abc import check_if_installed_already
3
+ from machineconfig.utils.installer_utils.installer_abc import check_if_installed_already, parse_apps_installer_linux, parse_apps_installer_windows
4
+
4
5
  from machineconfig.utils.installer_utils.installer_class import Installer
5
6
  from machineconfig.utils.schemas.installer.installer_types import InstallerData, InstallerDataFiles, get_normalized_arch, get_os_name, OPERATING_SYSTEMS, CPU_ARCHITECTURES
6
7
  from machineconfig.jobs.installer.package_groups import PACKAGE_GROUPS, PACKAGE_GROUP2NAMES
@@ -8,7 +9,7 @@ from rich.console import Console
8
9
  from rich.panel import Panel
9
10
 
10
11
  from machineconfig.utils.path_extended import PathExtended as PathExtended
11
- from machineconfig.utils.source_of_truth import INSTALL_VERSION_ROOT, LINUX_INSTALL_PATH
12
+ from machineconfig.utils.source_of_truth import INSTALL_VERSION_ROOT, LINUX_INSTALL_PATH, LIBRARY_ROOT
12
13
  from machineconfig.utils.io import read_json
13
14
 
14
15
  from typing import Any
@@ -119,6 +120,28 @@ def get_all_installer_data_files() -> list[InstallerData]:
119
120
  return res_final
120
121
 
121
122
 
123
+ def get_installers_system_groups():
124
+ res_final: list[InstallerData] = []
125
+ from platform import system
126
+ if system() == "Windows":
127
+ options_system = parse_apps_installer_windows(LIBRARY_ROOT.joinpath("setup_windows/apps.ps1").read_text(encoding="utf-8"))
128
+ elif system() == "Linux" or system() == "Darwin":
129
+ options_system = parse_apps_installer_linux(LIBRARY_ROOT.joinpath("setup_linux/apps.sh").read_text(encoding="utf-8"))
130
+ else:
131
+ raise NotImplementedError(f"❌ System {system()} not supported")
132
+ os_name = get_os_name()
133
+ for group_name, (docs, script) in options_system.items():
134
+ item: InstallerData = {
135
+ "appName": group_name,
136
+ "doc": docs,
137
+ "repoURL": "CMD",
138
+ "fileNamePattern": {
139
+ "amd64": {os_name: script,},
140
+ "arm64": {os_name: script,},}}
141
+ res_final.append(item)
142
+ return res_final
143
+
144
+
122
145
  def install_all(installers_data: list[InstallerData], safe: bool = False, jobs: int = 10, fresh: bool = False):
123
146
  print(f"\n{'=' * 80}\n🚀 BULK INSTALLATION PROCESS 🚀\n{'=' * 80}")
124
147
  if fresh:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: machineconfig
3
- Version: 4.9
3
+ Version: 4.91
4
4
  Summary: Dotfiles management package
5
5
  Author-email: Alex Al-Saffar <programmer@usa.com>
6
6
  License: Apache 2.0
@@ -43,7 +43,7 @@ machineconfig/cluster/templates/utils.py,sha256=5lHgjHvodoSPBD31AwluHBBNgwimwThU
43
43
  machineconfig/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
44
  machineconfig/jobs/installer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
45
  machineconfig/jobs/installer/installer_data.json,sha256=sOfqIPU4uarxbuD4HBRs3tXfIKx5tUtNQQdALygwk2o,71545
46
- machineconfig/jobs/installer/package_groups.py,sha256=Tj_259bNmkJr_Vp36t0IBYUly4AZ2SbydNDhmT15RN0,2420
46
+ machineconfig/jobs/installer/package_groups.py,sha256=SayXJYkgYZiUyAT2YLWrDBXB1YYJbuHe0D_eFQQIQn8,2505
47
47
  machineconfig/jobs/installer/custom/gh.py,sha256=hic8Z1ZdncbljY6hgHzl2rmOLOcb6imIUstMALSS3-Y,3082
48
48
  machineconfig/jobs/installer/custom/hx.py,sha256=FrUD0mlhWG2GxrnarccVIaW_sHJ5mxeF6yyzbBWyx6w,5840
49
49
  machineconfig/jobs/installer/custom_dev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -102,6 +102,7 @@ machineconfig/profile/records/windows/apps_summary_report.csv,sha256=nN5BoACBqXg
102
102
  machineconfig/profile/records/windows/apps_summary_report.md,sha256=O5hmAcpObaLmOjYLvHg9kkPJryqFwFaP8OsmfPwfR1o,137
103
103
  machineconfig/scripts/__init__.py,sha256=v0cMjnaIo39C3ltLiTf1S0fCTMAqWtEU7zrVenUj4PQ,71
104
104
  machineconfig/scripts/cloud/init.sh,sha256=zPn3_hwsHduaRxHs97TTn-BoLaJS44I2XwlLmZudQ80,4646
105
+ machineconfig/scripts/linux/agents,sha256=zahzfVZ8_NIkC1TKMjcZqo0vsBtFl-xBhpz63sn29yA,96
105
106
  machineconfig/scripts/linux/choose_wezterm_theme,sha256=T7_vS-XvIZErRkfqtlyoZuHEVKFQQwhIeQMFIVTjtxg,145
106
107
  machineconfig/scripts/linux/cloud_copy,sha256=IU5TO7roSUYB-U4Km9bhAZOvlUr4nRJtJf4tqCPIPAs,100
107
108
  machineconfig/scripts/linux/cloud_mount,sha256=QnDUPUv9q3V14PONOwM4tAPHqOopF_uvjEN1tL24jZA,102
@@ -125,6 +126,7 @@ machineconfig/scripts/linux/mount_nw_drive,sha256=pNzHc7yZn5YIzn2BkpKvd5530Pqbes
125
126
  machineconfig/scripts/linux/mount_smb,sha256=7UN5EP1kuxYL_-CnyaH4f9Wuu2CgALDZpJ0mPcdvCiY,94
126
127
  machineconfig/scripts/linux/repos,sha256=1qbmIemZjkjcPmiL1Bp8pD46E83OXsR5EJ0XQt29Bhc,96
127
128
  machineconfig/scripts/linux/scheduler,sha256=Z9Wu0N9vWRbi4FoRbpcc4ydq4bVaDjZOXESR35ZN0rI,100
129
+ machineconfig/scripts/linux/sessions,sha256=A4vxUDHnDhyph833iy-tBprgQ7av_DZ5t031PRrbqVQ,98
128
130
  machineconfig/scripts/linux/share_cloud.sh,sha256=75IzCm7Nob1wO-zlfaNyPPod1IjAsVCG5lcMFdXmiI4,3010
129
131
  machineconfig/scripts/linux/share_nfs,sha256=LDQZQ9TV7z2y7RtNHiO4Wb513MztyGjaAV-GzTGwUdc,1374
130
132
  machineconfig/scripts/linux/share_smb,sha256=HZX8BKgMlS9JzkGIYnxTsPvoxEBBuVLVkqzR3pmGFGY,20
@@ -137,33 +139,32 @@ machineconfig/scripts/linux/warp-cli.sh,sha256=shFFZ9viet_DSEEHT8kxlGRHoJpO6o85p
137
139
  machineconfig/scripts/linux/wifi_conn,sha256=X4TH3OvcVZfOveSbF9WW8uXb4U_G7ZSnCERc7VYAqkc,95
138
140
  machineconfig/scripts/linux/z_ls,sha256=ATZtu0ccN3AKvAOxkwLq1xgQjJ3en5byEWJ3Q8afnNg,3340
139
141
  machineconfig/scripts/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
+ machineconfig/scripts/python/agents.py,sha256=RtRR53Mt3zTqHqJbS5nY7XHRbZPty8hPl1mpgKAvaME,9832
140
143
  machineconfig/scripts/python/choose_wezterm_theme.py,sha256=Hlu_EOQhLM6wYdAdY25jcqEK11BkVwQYwkz04xnIBVU,3397
141
144
  machineconfig/scripts/python/cloud_copy.py,sha256=_pxA8o3ar5vH9DkrAdwafHcZMiqNCbY_IfNzKCOMJ5k,8395
142
145
  machineconfig/scripts/python/cloud_manager.py,sha256=YN0DYLzPKtMBaks-EAVwFmkCu3XeHWMr1D21uqX5dDk,3429
143
146
  machineconfig/scripts/python/cloud_mount.py,sha256=RFMzRUep2D5HtVXANIi-pab3EkI-W8P1IJ32k1W7xQA,6756
144
147
  machineconfig/scripts/python/cloud_repo_sync.py,sha256=GBhdUu9BJwhLYmhxxtvqJGLy7xKdQcnH9kkL4jcbzEE,9502
145
148
  machineconfig/scripts/python/cloud_sync.py,sha256=RWGpAfJ9fnN18yNBSgN44dzA38Hmd4879JL5r2pcyrM,3514
146
- machineconfig/scripts/python/croshell.py,sha256=shv0FmFfD2Br0EVE-zvpt4i5Tl8kliLlIvxkx0umGiA,8954
147
- machineconfig/scripts/python/devops.py,sha256=WMO5VLPkKZ38OAZCfhh_NvPv58HPh1TbhN7ZrQmN2Xs,4043
149
+ machineconfig/scripts/python/croshell.py,sha256=wYi8xWkzYzpfg8YNppmu22mvx0Gxtbs979ERO3kZS2w,8587
150
+ machineconfig/scripts/python/devops.py,sha256=fTEut6gTDfmNqzS8-gRyRAsmWJYPGGIt8X35Irj7Cl8,3434
148
151
  machineconfig/scripts/python/devops_add_identity.py,sha256=JfN3ZrYMCgmt4ks_VCfnV9BIIHAsOYO3E0W0wZ15FR8,3791
149
152
  machineconfig/scripts/python/devops_add_ssh_key.py,sha256=KaoX83KltBsmutfKhSfZjd7nP_R1hJ2OLAWRhbswO7o,6889
150
153
  machineconfig/scripts/python/devops_backup_retrieve.py,sha256=jZe5Vki7E2GCMG8hvqUZeOONFC4cNzISoGzq_dMG4GA,5601
151
- machineconfig/scripts/python/devops_devapps_install.py,sha256=C7PJEvfBftVvY6zRfDR6IR8MFagG5vssOdMOCLX67zg,11261
154
+ machineconfig/scripts/python/devops_devapps_install.py,sha256=f22pUQQjY0AGs4jjxSgYz1e0LOfZGXucTH1lmgQa5Vw,10233
152
155
  machineconfig/scripts/python/devops_update_repos.py,sha256=c5qBc9cuTGDEqDHufkjDT4d_vvJsswv3tlqk9MAulYk,8063
153
156
  machineconfig/scripts/python/dotfile.py,sha256=SRcX-9Ak1jRvF-killBTTm2IWcsNxfiLucH6ZsytAFA,2202
154
- machineconfig/scripts/python/fire_agents.py,sha256=aLxwM8o3Tpe4nYpNdnEvG8WVdplE3_tfnDECIXONzAg,9579
155
157
  machineconfig/scripts/python/fire_agents_help_launch.py,sha256=1ymWiszfjCyPv3ofinWzfOmbzLEt3d7ntac_afLh-V4,5017
156
158
  machineconfig/scripts/python/fire_agents_help_search.py,sha256=qIfSS_su2YJ1Gb0_lu4cbjlJlYMBw0v52NTGiSrGjk8,2991
157
159
  machineconfig/scripts/python/fire_agents_helper_types.py,sha256=zKu8Vr6iucaGSkCm_Tkt_WrYU7-6Nript3coYyzTXzY,295
158
160
  machineconfig/scripts/python/fire_agents_load_balancer.py,sha256=mpqx3uaQdBXYieuvhdK-qsvLepf9oIMo3pwPj9mSEDI,1079
159
161
  machineconfig/scripts/python/fire_jobs.py,sha256=7R4CO7wGRkG6akPLK6SMHr82_RdIeXIJNicCAdgh1ok,20262
160
162
  machineconfig/scripts/python/fire_jobs_args_helper.py,sha256=5zqnYvBjXSLFUqMHg5fgI62YnDu7CpVC4RLmXUKpI2I,2050
161
- machineconfig/scripts/python/fire_jobs_layout_helper.py,sha256=u0VssrTXOzH7km89yaL1K8T5DF83LRyllj1E_30N9ZQ,8083
162
163
  machineconfig/scripts/python/fire_jobs_streamlit_helper.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
163
164
  machineconfig/scripts/python/ftpx.py,sha256=l_gdJS0QB2wVZErubtZvm4HJD9HZAJxSP68sbY73xwo,10278
164
165
  machineconfig/scripts/python/get_zellij_cmd.py,sha256=e35-18hoXM9N3PFbvbizfkNY_-63iMicieWE3TbGcCQ,576
165
166
  machineconfig/scripts/python/gh_models.py,sha256=3BLfW25mBRiPO5VKtVm-nMlKLv-PaZDw7mObajq6F6M,5538
166
- machineconfig/scripts/python/interactive.py,sha256=9ulwdt8l-XlXEvp44Jer0fli3ntJ_wq1kId-IoqDngc,13721
167
+ machineconfig/scripts/python/interactive.py,sha256=AM2jPIAHbXppVj-lA9iYcOTGWmOMWZtIaJIz9K5FxK8,11983
167
168
  machineconfig/scripts/python/mount_nfs.py,sha256=c8pWXimDWdgCkSskcnPgT-8ESPosil6Cvy2hGSaIBJE,3359
168
169
  machineconfig/scripts/python/mount_nw_drive.py,sha256=iru6AtnTyvyuk6WxlK5R4lDkuliVpPV5_uBTVVhXtjQ,1550
169
170
  machineconfig/scripts/python/mount_ssh.py,sha256=rGY2pgtlnWMi0Rrge1aCdjtfbULrj2cyaStDoX-y2w4,2236
@@ -175,6 +176,7 @@ machineconfig/scripts/python/repos_helper_clone.py,sha256=xW5YZEoNt3k7h9NIULhUhO
175
176
  machineconfig/scripts/python/repos_helper_record.py,sha256=YEEQORfEiLddOIIgePo5eEkyQUFruFg3kc8npMvRL-o,10927
176
177
  machineconfig/scripts/python/repos_helper_update.py,sha256=AYyKIB7eQ48yoYmFjydIhRI1lV39TBv_S4_LCa-oKuQ,11042
177
178
  machineconfig/scripts/python/scheduler.py,sha256=rKhssuxkD697EY6qaV6CSdNhxpAQLDWO4fE8GMCQ9FA,3061
179
+ machineconfig/scripts/python/sessions.py,sha256=WT-WVmrYDe3u-4Gjjm_1Apq879qcOtM6TCR4Q-9JZys,8299
178
180
  machineconfig/scripts/python/share_terminal.py,sha256=biuG35YiknTMVr3Mzs4bBZwEq53JcuBRlzMTp6eY90M,5009
179
181
  machineconfig/scripts/python/snapshot.py,sha256=aDvKeoniZaeTSNv9zWBUajaj2yagAxVdfuvO1_tgq5Y,1026
180
182
  machineconfig/scripts/python/start_slidev.py,sha256=U5ujAL7R5Gd5CzFReTsnF2SThjY91aFBg0Qz_MMl6U4,4573
@@ -359,7 +361,6 @@ machineconfig/setup_linux/nix/cli_installation.sh,sha256=AQ_wRmldeD1tPqCmU7qgz9Z
359
361
  machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh,sha256=F5dbg0n9RHsKGPn8fIdZMn3p0RrHEkb8rWBGsdVGbus,1207
360
362
  machineconfig/setup_linux/others/openssh-server_add_pub_key.sh,sha256=UiJcD1o4UekKKtp5YJKRq135PpqdTLXy7M6HvQ-Qum4,1993
361
363
  machineconfig/setup_linux/web_shortcuts/android.sh,sha256=gzep6bBhK7FCBvGcXK0fdJCtkSfBOftt0aFyDZq_eMs,68
362
- machineconfig/setup_linux/web_shortcuts/ascii_art.sh,sha256=RWcxH_Db7WHH37PclYmc92o6zAS557wGZxcYTuyTUZ0,3550
363
364
  machineconfig/setup_linux/web_shortcuts/croshell.sh,sha256=X9-B1cVptbaFWaWTA-2ELNQx_2ktxu7ZVe48RvpCmkU,316
364
365
  machineconfig/setup_linux/web_shortcuts/interactive.sh,sha256=3bQr-0Gtly7lx6LPXtCUCs49jiCCozv3T1idHK678EY,463
365
366
  machineconfig/setup_linux/web_shortcuts/ssh.sh,sha256=k6BAY-zAWsi1beOMiZODxw4VOjZCTABZu__gxSET1eU,1924
@@ -376,7 +377,7 @@ machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py,sha256=rZZJamy3YxAeJh
376
377
  machineconfig/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
377
378
  machineconfig/utils/accessories.py,sha256=W_9dLzjwNTW5JQk_pe3B2ijQ1nA2-8Kdg2r7VBtzgQs,4340
378
379
  machineconfig/utils/code.py,sha256=pKPHInKgXJWeACVbxuE7sMdYeZCbNttaYCsfonGhFfc,4464
379
- machineconfig/utils/installer.py,sha256=QPtSKlAUYuC3FeL076OLxpqfndTeNm_NSwxT71xg5FA,8744
380
+ machineconfig/utils/installer.py,sha256=Aoq93RMOQFmv1iYJS90sxrBHeG_K6N5DtIthYffcIOU,9743
380
381
  machineconfig/utils/io.py,sha256=ZXB3aataS1IZ_0WMcCRSmoN1nbkvEO-bWYcs-TpngqU,2872
381
382
  machineconfig/utils/links.py,sha256=riNUrG8aGElRszdOPOic4M2AyOcpdcth_-y8JEiZpJ4,10253
382
383
  machineconfig/utils/notifications.py,sha256=vvdsY5IX6XEiILTnt5lNyHxhCi0ljdGX2T_67VRfrG4,9009
@@ -403,8 +404,8 @@ machineconfig/utils/schemas/fire_agents/fire_agents_input.py,sha256=pTxvLzIpD5RF
403
404
  machineconfig/utils/schemas/installer/installer_types.py,sha256=QClRY61QaduBPJoSpdmTIdgS9LS-RvE-QZ-D260tD3o,1214
404
405
  machineconfig/utils/schemas/layouts/layout_types.py,sha256=TcqlZdGVoH8htG5fHn1KWXhRdPueAcoyApppZsPAPto,2020
405
406
  machineconfig/utils/schemas/repos/repos_types.py,sha256=ECVr-3IVIo8yjmYmVXX2mnDDN1SLSwvQIhx4KDDQHBQ,405
406
- machineconfig-4.9.dist-info/METADATA,sha256=Q2v8zeHn9aBZ75-Rwi2HzizabH_d3v42jlyEB_sZKBo,7060
407
- machineconfig-4.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
408
- machineconfig-4.9.dist-info/entry_points.txt,sha256=BhKeN0HFu7k3izf4f-Xp95tU3wGAr-TJrCuxDnfUwWo,1006
409
- machineconfig-4.9.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
410
- machineconfig-4.9.dist-info/RECORD,,
407
+ machineconfig-4.91.dist-info/METADATA,sha256=6itSuVawfwaAdJH3RfxSZVJddeSL434HDZ20XU63PBk,7061
408
+ machineconfig-4.91.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
409
+ machineconfig-4.91.dist-info/entry_points.txt,sha256=LcwklRJPY_uKBvStgtOJn5G_pmFCEdpgRNzUUc6twAQ,1134
410
+ machineconfig-4.91.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
411
+ machineconfig-4.91.dist-info/RECORD,,
@@ -1,4 +1,5 @@
1
1
  [console_scripts]
2
+ agents = machineconfig.scripts.python.agents:main_from_parser
2
3
  choose_wezterm_theme = machineconfig.scripts.python.choose_wezterm_theme:main
3
4
  cloud_copy = machineconfig.scripts.python.cloud_copy:arg_parser
4
5
  cloud_mount = machineconfig.scripts.python.cloud_mount:arg_parser
@@ -13,5 +14,6 @@ kill_process = machineconfig.utils.procs:main
13
14
  mount_nfs = machineconfig.scripts.python.mount_nfs:main
14
15
  mount_nw_drive = machineconfig.scripts.python.mount_nw_drive:main
15
16
  repos = machineconfig.scripts.python.repos:main_from_parser
17
+ sessions = machineconfig.scripts.python.sessions:main_from_parser
16
18
  start_slidev = machineconfig.scripts.python.start_slidev:arg_parser
17
19
  wifi_conn = machineconfig.scripts.python.wifi_conn:arg_parser
@@ -1,93 +0,0 @@
1
- #!/usr/bin/bash
2
- #=======================================================================
3
- # 🎨 ASCII ART TOOLS INSTALLATION SCRIPT
4
- #=======================================================================
5
- # This script installs various ASCII art and text formatting tools
6
-
7
- echo """#=======================================================================
8
- 🖼️ ASCII ART TOOLS | Installing terminal visualization packages
9
- #=======================================================================
10
- """
11
-
12
- # Alternate Nix installation method (commented reference)
13
- # if [ -f "$HOME/.nix-profile/bin/nix-env" ]; then
14
- # echo """# #=======================================================================
15
- # 📦 NIX PACKAGE INSTALLATION | Using Nix package manager
16
- # #=======================================================================
17
- # """
18
- # ~/.nix-profile/bin/nix-env -iA nixpkgs.cowsay || true
19
- # ~/.nix-profile/bin/nix-env -iA nixpkgs.lolcat || true
20
- # ~/.nix-profile/bin/nix-env -iA nixpkgs.boxes || true
21
- # ~/.nix-profile/bin/nix-env -iA nixpkgs.figlet || true
22
- # else
23
-
24
- # Check if cowsay is installed, if not install it
25
- if [ ! -f "/usr/games/cowsay" ]; then
26
- echo """ #=======================================================================
27
- 🐮 INSTALLING COWSAY | ASCII art animals with speech bubbles
28
- #=======================================================================
29
-
30
- 📋 Usage examples:
31
- $ cowsay "Hello World"
32
- $ cowsay -l (to list available figures)
33
- $ cowsay -f tux "Linux rocks!"
34
- """
35
- sudo nala install cowsay -y || true
36
- fi
37
-
38
- # Check if lolcat is installed, if not install it
39
- if [ ! -f "/usr/games/lolcat" ]; then
40
- echo """ #=======================================================================
41
- 🌈 INSTALLING LOLCAT | Rainbow text colorizer for terminal
42
- #=======================================================================
43
-
44
- 📋 Usage examples:
45
- $ echo "Hello World" | lolcat
46
- $ cowsay "Rainbow cow" | lolcat
47
- """
48
- sudo nala install lolcat -y || true
49
- fi
50
-
51
- # Check if boxes is installed, if not install it
52
- if [ ! -f "/usr/bin/boxes" ]; then
53
- echo """ #=======================================================================
54
- 📦 INSTALLING BOXES | ASCII art box drawing around text
55
- #=======================================================================
56
-
57
- 📋 Usage examples:
58
- $ echo "Hello World" | boxes
59
- $ echo "Custom box" | boxes -d stone
60
- $ boxes -l (to list available box styles)
61
- """
62
- sudo nala install boxes -y || true
63
- fi
64
-
65
- # Check if figlet is installed, if not install it
66
- if [ ! -f "/usr/bin/figlet" ]; then
67
- echo """ #=======================================================================
68
- 📝 INSTALLING FIGLET | Large ASCII text generator
69
- #=======================================================================
70
-
71
- 📋 Usage examples:
72
- $ figlet "Hello World"
73
- $ showfigfonts (to view available fonts)
74
- $ figlet -f slant "Custom font"
75
- """
76
- sudo nala install figlet -y || true
77
- fi
78
-
79
- echo """#=======================================================================
80
- ✅ INSTALLATION COMPLETE | All ASCII art tools installed successfully
81
- #=======================================================================
82
-
83
- 🎨 Installed tools:
84
- ✓ cowsay - ASCII art animals with text
85
- ✓ lolcat - Rainbow text colorizer
86
- ✓ boxes - Text in ASCII art boxes
87
- ✓ figlet - Large ASCII text generator
88
-
89
- 💡 Try combining them:
90
- $ figlet "Cool text" | boxes | lolcat
91
- $ cowsay -f tux "Linux" | lolcat
92
- """
93
- # fi