machineconfig 4.8__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.

Files changed (25) hide show
  1. machineconfig/jobs/installer/custom_dev/winget.py +1 -0
  2. machineconfig/jobs/installer/installer_data.json +2403 -0
  3. machineconfig/jobs/installer/package_groups.py +157 -0
  4. machineconfig/scripts/linux/agents +2 -0
  5. machineconfig/scripts/linux/sessions +2 -0
  6. machineconfig/scripts/python/{fire_agents.py → agents.py} +7 -0
  7. machineconfig/scripts/python/croshell.py +13 -27
  8. machineconfig/scripts/python/devops.py +0 -13
  9. machineconfig/scripts/python/devops_devapps_install.py +148 -107
  10. machineconfig/scripts/python/interactive.py +30 -76
  11. machineconfig/scripts/python/{fire_jobs_layout_helper.py → sessions.py} +7 -0
  12. machineconfig/utils/installer.py +40 -16
  13. machineconfig/utils/installer_utils/github_release_bulk.py +2 -12
  14. machineconfig/utils/installer_utils/installer_abc.py +56 -60
  15. machineconfig/utils/schemas/installer/installer_types.py +0 -1
  16. {machineconfig-4.8.dist-info → machineconfig-4.91.dist-info}/METADATA +1 -1
  17. {machineconfig-4.8.dist-info → machineconfig-4.91.dist-info}/RECORD +20 -21
  18. {machineconfig-4.8.dist-info → machineconfig-4.91.dist-info}/entry_points.txt +2 -0
  19. machineconfig/jobs/installer/packages_custom_dev.json +0 -380
  20. machineconfig/jobs/installer/packages_custom_essential.json +0 -39
  21. machineconfig/jobs/installer/packages_github_dev.json +0 -1127
  22. machineconfig/jobs/installer/packages_github_essential.json +0 -787
  23. machineconfig/setup_linux/web_shortcuts/ascii_art.sh +0 -93
  24. {machineconfig-4.8.dist-info → machineconfig-4.91.dist-info}/WHEEL +0 -0
  25. {machineconfig-4.8.dist-info → machineconfig-4.91.dist-info}/top_level.txt +0 -0
@@ -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
 
@@ -81,24 +83,7 @@ def install_windows_desktop_apps() -> bool:
81
83
  """Install Windows desktop applications using winget."""
82
84
  if system() != "Windows":
83
85
  console.print("❌ This function is only available on Windows systems.", style="bold red")
84
- return False
85
-
86
- console.print(Panel("💻 [bold cyan]WINDOWS DESKTOP APPS[/bold cyan]\n[italic]Installing Brave, Windows Terminal, PowerShell, and VSCode[/italic]", border_style="cyan"))
87
-
88
- # Install winget applications
89
- winget_commands = [
90
- ('winget install --no-upgrade --name "Windows Terminal" --Id "Microsoft.WindowsTerminal" --source winget --scope user --accept-package-agreements --accept-source-agreements', "Installing Windows Terminal"),
91
- ('winget install --no-upgrade --name "Powershell" --Id "Microsoft.PowerShell" --source winget --scope user --accept-package-agreements --accept-source-agreements', "Installing PowerShell"),
92
- ('winget install --no-upgrade --name "Brave" --Id "Brave.Brave" --source winget --scope user --accept-package-agreements --accept-source-agreements', "Installing Brave Browser"),
93
- ('winget install --no-upgrade --name "Microsoft Visual Studio Code" --Id "Microsoft.VisualStudioCode" --source winget --scope user --accept-package-agreements --accept-source-agreements', "Installing Visual Studio Code"),
94
- ]
95
-
96
- success = True
97
- for command, description in winget_commands:
98
- if not run_command(command, description):
99
- success = False
100
-
101
- # Install Nerd Fonts via Python
86
+ return False
102
87
  console.print("🔧 Installing Nerd Fonts", style="bold cyan")
103
88
  try:
104
89
  from machineconfig.jobs.installer.custom_dev.nerfont_windows_helper import install_nerd_fonts
@@ -106,34 +91,29 @@ def install_windows_desktop_apps() -> bool:
106
91
  console.print("✅ Nerd Fonts installed successfully", style="bold green")
107
92
  except Exception as e:
108
93
  console.print(f"❌ Error installing Nerd Fonts: {e}", style="bold red")
109
- success = False
110
-
111
- # Set Windows Terminal settings via Python
112
94
  console.print("🔧 Setting Windows Terminal settings", style="bold cyan")
113
95
  try:
114
96
  from machineconfig.setup_windows.wt_and_pwsh.set_wt_settings import main as set_wt_settings_main
115
97
  set_wt_settings_main()
116
98
  console.print("✅ Windows Terminal settings configured successfully", style="bold green")
117
99
  except Exception as e:
118
- console.print(f"❌ Error setting Windows Terminal settings: {e}", style="bold red")
119
- success = False
120
-
121
- return success
100
+ console.print(f"❌ Error setting Windows Terminal settings: {e}", style="bold red")
101
+ return True
122
102
 
123
103
 
124
104
  def get_installation_choices() -> list[str]:
125
105
  """Get user choices for installation options."""
126
106
  choices = [
127
- Choice(value="install_apps", title="📥 Install Apps - Install base system applications", checked=False),
128
107
  Choice(value="upgrade_system", title="🔄 Upgrade System Packages - Update all system packages", checked=False),
129
- 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),
130
113
  Choice(value="install_ssh_server", title="🔒 Install SSH Server - Set up remote access", checked=False),
131
114
  Choice(value="create_symlinks", title="🔗 Create Symlinks - Set up configuration symlinks (finish dotfiles transfer first)", checked=False),
132
- Choice(value="install_cli_apps", title="⚡ Install CLI Apps - Command-line tools installation", checked=False),
133
- Choice(value="install_dev_tools", title="🛠️ Install Development Tools - rust, libssl-dev, ffmpeg, wezterm, brave, code", checked=False),
134
115
  Choice(value="retrieve_repositories", title="📚 Retrieve Repositories - Clone repositories to ~/code", checked=False),
135
116
  Choice(value="retrieve_data", title="💾 Retrieve Data - Backup restoration", checked=False),
136
- Choice(value="install_ascii_art", title="🎨 Install ASCII Art Libraries - Terminal visualization tools", checked=False),
137
117
  ]
138
118
  # Add Windows-specific options
139
119
  if system() == "Windows":
@@ -148,24 +128,28 @@ def execute_installations(selected_options: list[str]) -> None:
148
128
  console.print(Panel("🐍 [bold green]PYTHON ENVIRONMENT[/bold green]\n[italic]Setting up base virtual environment[/italic]", border_style="green"))
149
129
  run_command("curl https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/setup_linux/ve.sh | bash", "Setting up base virtual environment")
150
130
 
151
- if "install_apps" in selected_options:
152
- console.print(Panel("📦 [bold blue]APPLICATIONS[/bold blue]\n[italic]Installing base system applications[/italic]", border_style="blue"))
153
- if system() == "Windows":
154
- # Windows: Use PowerShell to execute local apps.ps1 script
155
- from machineconfig import setup_windows as module
156
- script = Path(module.__file__).parent / "apps.ps1"
157
- run_command(f'powershell -ExecutionPolicy Bypass -File "{script}"', "Installing Windows applications")
158
- else:
159
- # Linux: Use existing bash script approach
160
- from machineconfig import setup_linux as module
161
- script = Path(module.__file__).parent / "apps.sh"
162
- 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")
163
143
 
164
144
  if "upgrade_system" in selected_options:
165
- console.print(Panel("🔄 [bold magenta]SYSTEM UPDATE[/bold magenta]\n[italic]Package management[/italic]", border_style="magenta"))
166
- run_command("sudo nala upgrade -y", "Upgrading system packages")
167
-
168
- if "install_uv_repos" in selected_options:
145
+ if system() == "Windows":
146
+ console.print(" System upgrade is not applicable on Windows via this script.", style="bold red")
147
+ elif system() == "Linux":
148
+ console.print(Panel("🔄 [bold magenta]SYSTEM UPDATE[/bold magenta]\n[italic]Package management[/italic]", border_style="magenta"))
149
+ run_command("sudo nala upgrade -y", "Upgrading system packages")
150
+ else:
151
+ console.print(f"❌ System upgrade not supported on {system()}.", style="bold red")
152
+ if "install_repos" in selected_options:
169
153
  console.print(Panel("🐍 [bold green]PYTHON ENVIRONMENT[/bold green]\n[italic]Virtual environment setup[/italic]", border_style="green"))
170
154
  from machineconfig import setup_linux as module
171
155
  script = Path(module.__file__).parent / "repos.sh"
@@ -199,30 +183,6 @@ Set-Service -Name sshd -StartupType 'Automatic'"""
199
183
  else:
200
184
  console.print("⏭️ Skipping symlink creation - finish dotfiles transfer first", style="yellow")
201
185
 
202
- if "install_cli_apps" in selected_options:
203
- console.print(Panel("⚡ [bold bright_yellow]CLI APPLICATIONS[/bold bright_yellow]\n[italic]Command-line tools installation[/italic]", border_style="bright_yellow"))
204
- console.print("🔧 Installing CLI applications", style="bold cyan")
205
- try:
206
- from machineconfig.scripts.python.devops_devapps_install import main as devops_devapps_install_main
207
- devops_devapps_install_main(which="essentials")
208
- console.print("✅ CLI applications installed successfully", style="bold green")
209
- except Exception as e:
210
- console.print(f"❌ Error installing CLI applications: {e}", style="bold red")
211
- run_command(". $HOME/.bashrc", "Reloading bash configuration")
212
-
213
- if "install_dev_tools" in selected_options:
214
- console.print(Panel("🛠️ [bold bright_blue]DEVELOPMENT TOOLS[/bold bright_blue]\n[italic]Software development packages[/italic]", border_style="bright_blue"))
215
- run_command("(curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh) || true", "Installing Rust toolchain")
216
- run_command("sudo nala install libssl-dev -y", "Installing libssl-dev")
217
- run_command("sudo nala install ffmpeg -y", "Installing ffmpeg")
218
- console.print("🔧 Installing development applications", style="bold cyan")
219
- try:
220
- from machineconfig.scripts.python.devops_devapps_install import main as devops_devapps_install_main
221
- devops_devapps_install_main(which="wezterm,brave,code")
222
- console.print("✅ Development applications installed successfully", style="bold green")
223
- except Exception as e:
224
- console.print(f"❌ Error installing development applications: {e}", style="bold red")
225
-
226
186
  if "retrieve_repositories" in selected_options:
227
187
  console.print(Panel("📚 [bold bright_magenta]REPOSITORIES[/bold bright_magenta]\n[italic]Project code retrieval[/italic]", border_style="bright_magenta"))
228
188
  from machineconfig.scripts.python import repos as module
@@ -238,12 +198,6 @@ Set-Service -Name sshd -StartupType 'Automatic'"""
238
198
  except Exception as e:
239
199
  console.print(f"❌ Error retrieving backup data: {e}", style="bold red")
240
200
 
241
- if "install_ascii_art" in selected_options:
242
- console.print(Panel("🎨 [bold bright_green]ASCII ART[/bold bright_green]\n[italic]Terminal visualization tools[/italic]", border_style="bright_green"))
243
- from machineconfig import setup_linux as module
244
- script = Path(module.__file__).parent / "web_shortcuts" / "ascii_art.sh"
245
- run_command(f"bash {script}", "Installing ASCII art libraries")
246
-
247
201
  if "install_windows_desktop" in selected_options:
248
202
  install_windows_desktop_apps()
249
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,13 +1,15 @@
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
- from machineconfig.utils.schemas.installer.installer_types import APP_INSTALLER_CATEGORY, InstallerData, InstallerDataFiles, get_normalized_arch, get_os_name, OPERATING_SYSTEMS, CPU_ARCHITECTURES
6
+ from machineconfig.utils.schemas.installer.installer_types import InstallerData, InstallerDataFiles, get_normalized_arch, get_os_name, OPERATING_SYSTEMS, CPU_ARCHITECTURES
7
+ from machineconfig.jobs.installer.package_groups import PACKAGE_GROUPS, PACKAGE_GROUP2NAMES
6
8
  from rich.console import Console
7
9
  from rich.panel import Panel
8
10
 
9
11
  from machineconfig.utils.path_extended import PathExtended as PathExtended
10
- 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
11
13
  from machineconfig.utils.io import read_json
12
14
 
13
15
  from typing import Any
@@ -18,7 +20,7 @@ from joblib import Parallel, delayed
18
20
  def check_latest():
19
21
  console = Console() # Added console initialization
20
22
  console.print(Panel("🔍 CHECKING FOR LATEST VERSIONS", title="Status", expand=False)) # Replaced print with Panel
21
- installers = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=["GITHUB_ESSENTIAL", "CUSTOM_ESSENTIAL"])
23
+ installers = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=["ESSENTIAL"])
22
24
  installers_github = []
23
25
  for inst__ in installers:
24
26
  app_name = inst__["appName"]
@@ -91,30 +93,52 @@ def get_installed_cli_apps():
91
93
  return apps
92
94
 
93
95
 
94
- def get_installers(os: OPERATING_SYSTEMS, arch: CPU_ARCHITECTURES, which_cats: list[APP_INSTALLER_CATEGORY]) -> list[InstallerData]:
96
+ def get_installers(os: OPERATING_SYSTEMS, arch: CPU_ARCHITECTURES, which_cats: list[PACKAGE_GROUPS]) -> list[InstallerData]:
95
97
  print(f"\n{'=' * 80}\n🔍 LOADING INSTALLER CONFIGURATIONS 🔍\n{'=' * 80}")
96
- res_all = get_all_installer_data_files(which_cats=which_cats)
98
+ res_all = get_all_installer_data_files()
99
+ acceptable_apps_names: list[str] = []
100
+ for cat in which_cats:
101
+ acceptable_apps_names += PACKAGE_GROUP2NAMES[cat]
97
102
  all_installers: list[InstallerData] = []
98
- for _category, installer_data_files in res_all.items():
99
- suitable_installers = []
100
- for an_installer in installer_data_files["installers"]:
101
- if an_installer["fileNamePattern"][arch][os] is None:
103
+ for installer_data in res_all:
104
+ if installer_data["appName"] in acceptable_apps_names:
105
+ if installer_data["fileNamePattern"][arch][os] is None:
102
106
  continue
103
- suitable_installers.append(an_installer)
104
- all_installers.extend(suitable_installers)
107
+ all_installers.append(installer_data)
105
108
  print(f"✅ Loaded {len(all_installers)} installer configurations\n{'=' * 80}")
106
109
  return all_installers
107
110
 
108
111
 
109
- def get_all_installer_data_files(which_cats: list[APP_INSTALLER_CATEGORY]) -> dict[APP_INSTALLER_CATEGORY, InstallerDataFiles]:
112
+ def get_all_installer_data_files() -> list[InstallerData]:
110
113
  print(f"\n{'=' * 80}\n📂 LOADING CONFIGURATION FILES 📂\n{'=' * 80}")
111
114
  import machineconfig.jobs.installer as module
112
115
  from pathlib import Path
113
116
  print("📂 Loading configuration files...")
114
- res_final: dict[APP_INSTALLER_CATEGORY, InstallerDataFiles] = {key: read_json(Path(module.__file__).parent.joinpath(f"packages_{key.lower()}.json")) for key in which_cats}
117
+ res_raw: InstallerDataFiles = read_json(Path(module.__file__).parent.joinpath("installer_data.json"))
118
+ res_final: list[InstallerData] = res_raw["installers"]
115
119
  print(f"Loaded: {len(res_final)} installer categories")
116
- for k, v in res_final.items():
117
- print(f" - {k}: {len(v['installers'])} items")
120
+ return res_final
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)
118
142
  return res_final
119
143
 
120
144
 
@@ -109,8 +109,7 @@ def main() -> None:
109
109
  current_dir = Path(__file__).parent
110
110
  installer_dir = current_dir.parent.parent / "jobs" / "installer"
111
111
 
112
- standard_json = installer_dir / "packages_standard.json"
113
- dev_json = installer_dir / "packages_dev.json"
112
+ standard_json = installer_dir / "installer_data.json"
114
113
  output_json = current_dir / "github_releases.json"
115
114
 
116
115
  print("🔍 Starting GitHub release data extraction...")
@@ -125,16 +124,7 @@ def main() -> None:
125
124
  all_github_repos.update(repos)
126
125
  print(f" Found {len(repos)} GitHub repos")
127
126
  else:
128
- print(f"⚠️ File not found: {standard_json}")
129
-
130
- if dev_json.exists():
131
- print(f"📄 Reading {dev_json.name}...")
132
- repos = extract_github_repos_from_json(dev_json)
133
- all_github_repos.update(repos)
134
- print(f" Found {len(repos)} GitHub repos")
135
- else:
136
- print(f"⚠️ File not found: {dev_json}")
137
-
127
+ print(f"⚠️ File not found: {standard_json}")
138
128
  print(f"🎯 Total unique GitHub repositories found: {len(all_github_repos)}")
139
129
 
140
130
  if not all_github_repos:
@@ -3,7 +3,7 @@ from machineconfig.utils.path_extended import PathExtended as PathExtended
3
3
  from machineconfig.utils.source_of_truth import WINDOWS_INSTALL_PATH, LINUX_INSTALL_PATH, INSTALL_VERSION_ROOT
4
4
 
5
5
  from pathlib import Path
6
- from typing import Any, Optional
6
+ from typing import Optional
7
7
  import subprocess
8
8
  import platform
9
9
 
@@ -166,75 +166,71 @@ def check_if_installed_already(exe_name: str, version: Optional[str], use_cache:
166
166
  return ("⚠️ NotInstalled", "None", version or "unknown")
167
167
 
168
168
 
169
- def parse_apps_installer_linux(txt: str) -> dict[str, Any]:
169
+ def parse_apps_installer_linux(txt: str) -> dict[str, tuple[str, str]]:
170
170
  """Parse Linux shell installation scripts into logical chunks.
171
171
 
172
- Supports two formats:
173
- 1. Legacy format with 'yes '' | sed 3q; echo "----------------------------- installing' delimiter
174
- 2. New format with # --BLOCK:<name>-- comment signatures
172
+ Splits scripts by # --GROUP:<name>:<description> comment signatures into a dictionary
173
+ mapping block names to (description, shell script content) tuples.
175
174
 
176
175
  Returns:
177
- dict[str, str]: Dictionary mapping block/section names to their installation scripts
176
+ dict[str, tuple[str, str]]: Dictionary mapping block/section names to (description, installation_script) tuples
178
177
  """
179
- # Try new block format first
180
- if "# --BLOCK:" in txt:
181
- import re
182
- # Split by block signatures: # --BLOCK:<name>--
183
- blocks = re.split(r'# --BLOCK:([^-]+)--', txt)
184
- res: dict[str, str] = {}
178
+ chunks = txt.split('# --GROUP:')
179
+ res: dict[str, tuple[str, str]] = {}
180
+
181
+ for chunk in chunks[1:]: # Skip first empty chunk before first group
182
+ lines = chunk.split('\n')
183
+ # First line contains the group name and description in format "NAME:DESCRIPTION"
184
+ group_line = lines[0].strip()
185
+
186
+ # Extract group name and description
187
+ if ':' in group_line:
188
+ parts = group_line.split(':', 1) # Split only on first colon
189
+ group_name = parts[0].strip()
190
+ group_description = parts[1].strip() if len(parts) > 1 else ""
191
+ else:
192
+ group_name = group_line
193
+ group_description = ""
185
194
 
186
- # Process blocks in pairs (block_name, block_content)
187
- for i in range(1, len(blocks), 2):
188
- if i + 1 < len(blocks):
189
- block_name = blocks[i].strip()
190
- block_content = blocks[i + 1].strip()
191
- if block_content:
192
- res[block_name] = block_content
195
+ # Rest is the content
196
+ content = '\n'.join(lines[1:]).strip()
193
197
 
194
- return res
198
+ if group_name and content:
199
+ res[group_name] = (group_description, content)
195
200
 
196
- # Legacy format fallback
197
- txts = txt.split("""yes '' | sed 3q; echo "----------------------------- installing """)
198
- res = {}
199
- for chunk in txts[1:]:
200
- try:
201
- k = chunk.split("----")[0].rstrip().lstrip()
202
- v = "\n".join(chunk.split("\n")[1:])
203
- res[k] = v
204
- except IndexError as e:
205
- print(f"""
206
- ❌ Error parsing chunk:
207
- {"-" * 50}
208
- {chunk}
209
- {"-" * 50}""")
210
- raise e
211
201
  return res
212
202
 
213
203
 
214
- def parse_apps_installer_windows(txt: str) -> dict[str, Any]:
215
- chunks: list[str] = []
216
- for idx, item in enumerate(txt.split(sep="winget install")):
217
- if idx == 0:
218
- continue
219
- if idx == 1:
220
- chunks.append(item)
204
+ def parse_apps_installer_windows(txt: str) -> dict[str, tuple[str, str]]:
205
+ """Parse Windows PowerShell installation scripts into logical chunks.
206
+
207
+ Splits scripts by # --GROUP:<name>:<description> comment signatures into a dictionary
208
+ mapping block names to (description, PowerShell script content) tuples.
209
+
210
+ Returns:
211
+ dict[str, tuple[str, str]]: Dictionary mapping block/section names to (description, installation_script) tuples
212
+ """
213
+ chunks = txt.split('# --GROUP:')
214
+ res: dict[str, tuple[str, str]] = {}
215
+
216
+ for chunk in chunks[1:]: # Skip first chunk before first group
217
+ lines = chunk.split('\n')
218
+ # First line contains the group name and description in format "NAME:DESCRIPTION"
219
+ group_line = lines[0].strip()
220
+
221
+ # Extract group name and description
222
+ if ':' in group_line:
223
+ parts = group_line.split(':', 1) # Split only on first colon
224
+ group_name = parts[0].strip()
225
+ group_description = parts[1].strip() if len(parts) > 1 else ""
221
226
  else:
222
- chunks.append("winget install" + item)
223
- # progs = L(txt.splitlines()).filter(lambda x: x.startswith("winget ") or x.startswith("#winget"))
224
- res: dict[str, str] = {}
225
- for a_chunk in chunks:
226
- try:
227
- name = a_chunk.split("--name ")[1]
228
- if "--Id" not in name:
229
- print(f"⚠️ Warning: {name} does not have an Id, skipping")
230
- continue
231
- name = name.split(" --Id ", maxsplit=1)[0].strip('"').strip('"')
232
- res[name] = a_chunk
233
- except IndexError as e:
234
- print(f"""
235
- ❌ Error parsing chunk:
236
- {"-" * 50}
237
- {a_chunk}
238
- {"-" * 50}""")
239
- raise e
227
+ group_name = group_line
228
+ group_description = ""
229
+
230
+ # Rest is the content
231
+ content = '\n'.join(lines[1:]).strip()
232
+
233
+ if group_name and content:
234
+ res[group_name] = (group_description, content)
235
+
240
236
  return res
@@ -2,7 +2,6 @@ from typing import TypedDict, Literal, TypeAlias, Optional
2
2
  import platform
3
3
 
4
4
 
5
- APP_INSTALLER_CATEGORY: TypeAlias = Literal["GITHUB_ESSENTIAL", "CUSTOM_ESSENTIAL", "GITHUB_DEV", "CUSTOM_DEV"]
6
5
  CPU_ARCHITECTURES: TypeAlias = Literal["amd64", "arm64"]
7
6
  OPERATING_SYSTEMS: TypeAlias = Literal["windows", "linux", "macos"]
8
7
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: machineconfig
3
- Version: 4.8
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
@@ -42,10 +42,8 @@ machineconfig/cluster/templates/run_remote.py,sha256=vCc56t8BUAUJp7tyb0PFfwy5hlm
42
42
  machineconfig/cluster/templates/utils.py,sha256=5lHgjHvodoSPBD31AwluHBBNgwimwThUsDNWGN8iH9I,1647
43
43
  machineconfig/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
44
  machineconfig/jobs/installer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
- machineconfig/jobs/installer/packages_custom_dev.json,sha256=MiHmV7hCfa4RzmO6LK3PPz0VGn3yQJgPJxrSgxKvwdc,10027
46
- machineconfig/jobs/installer/packages_custom_essential.json,sha256=-Mgu436rbGE7JWCy-NYxxsnkxCxPxv4Gatu0wXp5XMI,775
47
- machineconfig/jobs/installer/packages_github_dev.json,sha256=11LVsvIVKMjp8i3y_TNO31IpXaZgQWGGlmhMa_wUilE,31889
48
- machineconfig/jobs/installer/packages_github_essential.json,sha256=dCGFovFPCnEu-4wed7FJDBxPHdz8ekkAK58VTQobsdg,26472
45
+ machineconfig/jobs/installer/installer_data.json,sha256=sOfqIPU4uarxbuD4HBRs3tXfIKx5tUtNQQdALygwk2o,71545
46
+ machineconfig/jobs/installer/package_groups.py,sha256=SayXJYkgYZiUyAT2YLWrDBXB1YYJbuHe0D_eFQQIQn8,2505
49
47
  machineconfig/jobs/installer/custom/gh.py,sha256=hic8Z1ZdncbljY6hgHzl2rmOLOcb6imIUstMALSS3-Y,3082
50
48
  machineconfig/jobs/installer/custom/hx.py,sha256=FrUD0mlhWG2GxrnarccVIaW_sHJ5mxeF6yyzbBWyx6w,5840
51
49
  machineconfig/jobs/installer/custom_dev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -61,7 +59,7 @@ machineconfig/jobs/installer/custom_dev/nerdfont.py,sha256=oOYC5BpukZIA_pGSDRMZm
61
59
  machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py,sha256=sdgbHCbu_6d8VotLRvpL_GrwpEoxY4dupOyRUjtpaYA,5554
62
60
  machineconfig/jobs/installer/custom_dev/redis.py,sha256=KjqJkCKZi8fbdW6IhIZjmA4pdo8oZF84Fflij_7dVbg,2291
63
61
  machineconfig/jobs/installer/custom_dev/wezterm.py,sha256=BuTVRqV5WQUS2C7FpWMU4pQWgkPt4p3VVGcE6fTVG-0,2311
64
- machineconfig/jobs/installer/custom_dev/winget.py,sha256=GZ-ZXhT48UpvL8yfmeoKC6hCGvK1bgOLc64up4S3UjQ,5511
62
+ machineconfig/jobs/installer/custom_dev/winget.py,sha256=gLdwM20jKMf2bMV3BAcOg4MkuzwF09CU5OhXvLkPoHo,5738
65
63
  machineconfig/jobs/installer/linux_scripts/brave.sh,sha256=m01xquA4YZW3YrhJiTCvTZuLliELmRI1avYFyuE5-Ws,2119
66
64
  machineconfig/jobs/installer/linux_scripts/docker.sh,sha256=xP219QeQ5eLwhvOHsNYqOERMGdjBqvrL5jeoZj749XE,5347
67
65
  machineconfig/jobs/installer/linux_scripts/docker_start.sh,sha256=TiS-hWRltw66_p_Fq8gfkA_rqUIuwxoIkFZItVF6TXA,1478
@@ -104,6 +102,7 @@ machineconfig/profile/records/windows/apps_summary_report.csv,sha256=nN5BoACBqXg
104
102
  machineconfig/profile/records/windows/apps_summary_report.md,sha256=O5hmAcpObaLmOjYLvHg9kkPJryqFwFaP8OsmfPwfR1o,137
105
103
  machineconfig/scripts/__init__.py,sha256=v0cMjnaIo39C3ltLiTf1S0fCTMAqWtEU7zrVenUj4PQ,71
106
104
  machineconfig/scripts/cloud/init.sh,sha256=zPn3_hwsHduaRxHs97TTn-BoLaJS44I2XwlLmZudQ80,4646
105
+ machineconfig/scripts/linux/agents,sha256=zahzfVZ8_NIkC1TKMjcZqo0vsBtFl-xBhpz63sn29yA,96
107
106
  machineconfig/scripts/linux/choose_wezterm_theme,sha256=T7_vS-XvIZErRkfqtlyoZuHEVKFQQwhIeQMFIVTjtxg,145
108
107
  machineconfig/scripts/linux/cloud_copy,sha256=IU5TO7roSUYB-U4Km9bhAZOvlUr4nRJtJf4tqCPIPAs,100
109
108
  machineconfig/scripts/linux/cloud_mount,sha256=QnDUPUv9q3V14PONOwM4tAPHqOopF_uvjEN1tL24jZA,102
@@ -127,6 +126,7 @@ machineconfig/scripts/linux/mount_nw_drive,sha256=pNzHc7yZn5YIzn2BkpKvd5530Pqbes
127
126
  machineconfig/scripts/linux/mount_smb,sha256=7UN5EP1kuxYL_-CnyaH4f9Wuu2CgALDZpJ0mPcdvCiY,94
128
127
  machineconfig/scripts/linux/repos,sha256=1qbmIemZjkjcPmiL1Bp8pD46E83OXsR5EJ0XQt29Bhc,96
129
128
  machineconfig/scripts/linux/scheduler,sha256=Z9Wu0N9vWRbi4FoRbpcc4ydq4bVaDjZOXESR35ZN0rI,100
129
+ machineconfig/scripts/linux/sessions,sha256=A4vxUDHnDhyph833iy-tBprgQ7av_DZ5t031PRrbqVQ,98
130
130
  machineconfig/scripts/linux/share_cloud.sh,sha256=75IzCm7Nob1wO-zlfaNyPPod1IjAsVCG5lcMFdXmiI4,3010
131
131
  machineconfig/scripts/linux/share_nfs,sha256=LDQZQ9TV7z2y7RtNHiO4Wb513MztyGjaAV-GzTGwUdc,1374
132
132
  machineconfig/scripts/linux/share_smb,sha256=HZX8BKgMlS9JzkGIYnxTsPvoxEBBuVLVkqzR3pmGFGY,20
@@ -139,33 +139,32 @@ machineconfig/scripts/linux/warp-cli.sh,sha256=shFFZ9viet_DSEEHT8kxlGRHoJpO6o85p
139
139
  machineconfig/scripts/linux/wifi_conn,sha256=X4TH3OvcVZfOveSbF9WW8uXb4U_G7ZSnCERc7VYAqkc,95
140
140
  machineconfig/scripts/linux/z_ls,sha256=ATZtu0ccN3AKvAOxkwLq1xgQjJ3en5byEWJ3Q8afnNg,3340
141
141
  machineconfig/scripts/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
+ machineconfig/scripts/python/agents.py,sha256=RtRR53Mt3zTqHqJbS5nY7XHRbZPty8hPl1mpgKAvaME,9832
142
143
  machineconfig/scripts/python/choose_wezterm_theme.py,sha256=Hlu_EOQhLM6wYdAdY25jcqEK11BkVwQYwkz04xnIBVU,3397
143
144
  machineconfig/scripts/python/cloud_copy.py,sha256=_pxA8o3ar5vH9DkrAdwafHcZMiqNCbY_IfNzKCOMJ5k,8395
144
145
  machineconfig/scripts/python/cloud_manager.py,sha256=YN0DYLzPKtMBaks-EAVwFmkCu3XeHWMr1D21uqX5dDk,3429
145
146
  machineconfig/scripts/python/cloud_mount.py,sha256=RFMzRUep2D5HtVXANIi-pab3EkI-W8P1IJ32k1W7xQA,6756
146
147
  machineconfig/scripts/python/cloud_repo_sync.py,sha256=GBhdUu9BJwhLYmhxxtvqJGLy7xKdQcnH9kkL4jcbzEE,9502
147
148
  machineconfig/scripts/python/cloud_sync.py,sha256=RWGpAfJ9fnN18yNBSgN44dzA38Hmd4879JL5r2pcyrM,3514
148
- machineconfig/scripts/python/croshell.py,sha256=shv0FmFfD2Br0EVE-zvpt4i5Tl8kliLlIvxkx0umGiA,8954
149
- 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
150
151
  machineconfig/scripts/python/devops_add_identity.py,sha256=JfN3ZrYMCgmt4ks_VCfnV9BIIHAsOYO3E0W0wZ15FR8,3791
151
152
  machineconfig/scripts/python/devops_add_ssh_key.py,sha256=KaoX83KltBsmutfKhSfZjd7nP_R1hJ2OLAWRhbswO7o,6889
152
153
  machineconfig/scripts/python/devops_backup_retrieve.py,sha256=jZe5Vki7E2GCMG8hvqUZeOONFC4cNzISoGzq_dMG4GA,5601
153
- machineconfig/scripts/python/devops_devapps_install.py,sha256=QbRQhNdDRLLtgJwaRl2pbLmWvajb1b_Xte2ql8N3JRs,9096
154
+ machineconfig/scripts/python/devops_devapps_install.py,sha256=f22pUQQjY0AGs4jjxSgYz1e0LOfZGXucTH1lmgQa5Vw,10233
154
155
  machineconfig/scripts/python/devops_update_repos.py,sha256=c5qBc9cuTGDEqDHufkjDT4d_vvJsswv3tlqk9MAulYk,8063
155
156
  machineconfig/scripts/python/dotfile.py,sha256=SRcX-9Ak1jRvF-killBTTm2IWcsNxfiLucH6ZsytAFA,2202
156
- machineconfig/scripts/python/fire_agents.py,sha256=aLxwM8o3Tpe4nYpNdnEvG8WVdplE3_tfnDECIXONzAg,9579
157
157
  machineconfig/scripts/python/fire_agents_help_launch.py,sha256=1ymWiszfjCyPv3ofinWzfOmbzLEt3d7ntac_afLh-V4,5017
158
158
  machineconfig/scripts/python/fire_agents_help_search.py,sha256=qIfSS_su2YJ1Gb0_lu4cbjlJlYMBw0v52NTGiSrGjk8,2991
159
159
  machineconfig/scripts/python/fire_agents_helper_types.py,sha256=zKu8Vr6iucaGSkCm_Tkt_WrYU7-6Nript3coYyzTXzY,295
160
160
  machineconfig/scripts/python/fire_agents_load_balancer.py,sha256=mpqx3uaQdBXYieuvhdK-qsvLepf9oIMo3pwPj9mSEDI,1079
161
161
  machineconfig/scripts/python/fire_jobs.py,sha256=7R4CO7wGRkG6akPLK6SMHr82_RdIeXIJNicCAdgh1ok,20262
162
162
  machineconfig/scripts/python/fire_jobs_args_helper.py,sha256=5zqnYvBjXSLFUqMHg5fgI62YnDu7CpVC4RLmXUKpI2I,2050
163
- machineconfig/scripts/python/fire_jobs_layout_helper.py,sha256=u0VssrTXOzH7km89yaL1K8T5DF83LRyllj1E_30N9ZQ,8083
164
163
  machineconfig/scripts/python/fire_jobs_streamlit_helper.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
164
  machineconfig/scripts/python/ftpx.py,sha256=l_gdJS0QB2wVZErubtZvm4HJD9HZAJxSP68sbY73xwo,10278
166
165
  machineconfig/scripts/python/get_zellij_cmd.py,sha256=e35-18hoXM9N3PFbvbizfkNY_-63iMicieWE3TbGcCQ,576
167
166
  machineconfig/scripts/python/gh_models.py,sha256=3BLfW25mBRiPO5VKtVm-nMlKLv-PaZDw7mObajq6F6M,5538
168
- machineconfig/scripts/python/interactive.py,sha256=YA0N_NEbNttYS42ahJOjwoMKoYlvUL_fJapzjSTVOgs,15073
167
+ machineconfig/scripts/python/interactive.py,sha256=AM2jPIAHbXppVj-lA9iYcOTGWmOMWZtIaJIz9K5FxK8,11983
169
168
  machineconfig/scripts/python/mount_nfs.py,sha256=c8pWXimDWdgCkSskcnPgT-8ESPosil6Cvy2hGSaIBJE,3359
170
169
  machineconfig/scripts/python/mount_nw_drive.py,sha256=iru6AtnTyvyuk6WxlK5R4lDkuliVpPV5_uBTVVhXtjQ,1550
171
170
  machineconfig/scripts/python/mount_ssh.py,sha256=rGY2pgtlnWMi0Rrge1aCdjtfbULrj2cyaStDoX-y2w4,2236
@@ -177,6 +176,7 @@ machineconfig/scripts/python/repos_helper_clone.py,sha256=xW5YZEoNt3k7h9NIULhUhO
177
176
  machineconfig/scripts/python/repos_helper_record.py,sha256=YEEQORfEiLddOIIgePo5eEkyQUFruFg3kc8npMvRL-o,10927
178
177
  machineconfig/scripts/python/repos_helper_update.py,sha256=AYyKIB7eQ48yoYmFjydIhRI1lV39TBv_S4_LCa-oKuQ,11042
179
178
  machineconfig/scripts/python/scheduler.py,sha256=rKhssuxkD697EY6qaV6CSdNhxpAQLDWO4fE8GMCQ9FA,3061
179
+ machineconfig/scripts/python/sessions.py,sha256=WT-WVmrYDe3u-4Gjjm_1Apq879qcOtM6TCR4Q-9JZys,8299
180
180
  machineconfig/scripts/python/share_terminal.py,sha256=biuG35YiknTMVr3Mzs4bBZwEq53JcuBRlzMTp6eY90M,5009
181
181
  machineconfig/scripts/python/snapshot.py,sha256=aDvKeoniZaeTSNv9zWBUajaj2yagAxVdfuvO1_tgq5Y,1026
182
182
  machineconfig/scripts/python/start_slidev.py,sha256=U5ujAL7R5Gd5CzFReTsnF2SThjY91aFBg0Qz_MMl6U4,4573
@@ -361,7 +361,6 @@ machineconfig/setup_linux/nix/cli_installation.sh,sha256=AQ_wRmldeD1tPqCmU7qgz9Z
361
361
  machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh,sha256=F5dbg0n9RHsKGPn8fIdZMn3p0RrHEkb8rWBGsdVGbus,1207
362
362
  machineconfig/setup_linux/others/openssh-server_add_pub_key.sh,sha256=UiJcD1o4UekKKtp5YJKRq135PpqdTLXy7M6HvQ-Qum4,1993
363
363
  machineconfig/setup_linux/web_shortcuts/android.sh,sha256=gzep6bBhK7FCBvGcXK0fdJCtkSfBOftt0aFyDZq_eMs,68
364
- machineconfig/setup_linux/web_shortcuts/ascii_art.sh,sha256=RWcxH_Db7WHH37PclYmc92o6zAS557wGZxcYTuyTUZ0,3550
365
364
  machineconfig/setup_linux/web_shortcuts/croshell.sh,sha256=X9-B1cVptbaFWaWTA-2ELNQx_2ktxu7ZVe48RvpCmkU,316
366
365
  machineconfig/setup_linux/web_shortcuts/interactive.sh,sha256=3bQr-0Gtly7lx6LPXtCUCs49jiCCozv3T1idHK678EY,463
367
366
  machineconfig/setup_linux/web_shortcuts/ssh.sh,sha256=k6BAY-zAWsi1beOMiZODxw4VOjZCTABZu__gxSET1eU,1924
@@ -378,7 +377,7 @@ machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py,sha256=rZZJamy3YxAeJh
378
377
  machineconfig/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
379
378
  machineconfig/utils/accessories.py,sha256=W_9dLzjwNTW5JQk_pe3B2ijQ1nA2-8Kdg2r7VBtzgQs,4340
380
379
  machineconfig/utils/code.py,sha256=pKPHInKgXJWeACVbxuE7sMdYeZCbNttaYCsfonGhFfc,4464
381
- machineconfig/utils/installer.py,sha256=AVAzuJqWkbMmfEk5_eKLGA3kgM6PCTXq7We2QoppZo0,8886
380
+ machineconfig/utils/installer.py,sha256=Aoq93RMOQFmv1iYJS90sxrBHeG_K6N5DtIthYffcIOU,9743
382
381
  machineconfig/utils/io.py,sha256=ZXB3aataS1IZ_0WMcCRSmoN1nbkvEO-bWYcs-TpngqU,2872
383
382
  machineconfig/utils/links.py,sha256=riNUrG8aGElRszdOPOic4M2AyOcpdcth_-y8JEiZpJ4,10253
384
383
  machineconfig/utils/notifications.py,sha256=vvdsY5IX6XEiILTnt5lNyHxhCi0ljdGX2T_67VRfrG4,9009
@@ -398,15 +397,15 @@ machineconfig/utils/ai/generate_file_checklist.py,sha256=ajbmhcBToRugl75c_KZRq2X
398
397
  machineconfig/utils/cloud/onedrive/setup_oauth.py,sha256=ZTVkqgrwbV_EoPvyT8dyOTUE0ur3BW4sa9o6QYtt5Bo,2341
399
398
  machineconfig/utils/cloud/onedrive/transaction.py,sha256=m-aNcnWj_gfZVvJOSpkdIqjZxU_3nXx2CA-qKbQgP3I,26232
400
399
  machineconfig/utils/installer_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
401
- machineconfig/utils/installer_utils/github_release_bulk.py,sha256=vK5WJ-a566egAIEHdKsn3iOAh5LBqeY4zPDHPgqHVcE,6887
402
- machineconfig/utils/installer_utils/installer_abc.py,sha256=3jjLHL1xqTPowx52r7BfhjpzF6LQA7CRudjN2QYJP34,10551
400
+ machineconfig/utils/installer_utils/github_release_bulk.py,sha256=WJf_qZlF02SmIc6C7o1h4Gy4gAaJAfeAS8O9s2Itj-k,6535
401
+ machineconfig/utils/installer_utils/installer_abc.py,sha256=MRVfkjCPlPgCQQcSxXdVJMVnr_9CC3SQbFVDJxWy1zI,10813
403
402
  machineconfig/utils/installer_utils/installer_class.py,sha256=6IQswaC9mxIdeaMG-rOt-vqyKGYibBRMvC0UglZ_3mI,20268
404
403
  machineconfig/utils/schemas/fire_agents/fire_agents_input.py,sha256=pTxvLzIpD5RF508lUUBBkWcc4V1B10J4ylvVgVGkcM0,2037
405
- machineconfig/utils/schemas/installer/installer_types.py,sha256=DLagmIe0G5-xg7HZ9VrlFCDk1gIbwvX7O4gZjwq0wh0,1326
404
+ machineconfig/utils/schemas/installer/installer_types.py,sha256=QClRY61QaduBPJoSpdmTIdgS9LS-RvE-QZ-D260tD3o,1214
406
405
  machineconfig/utils/schemas/layouts/layout_types.py,sha256=TcqlZdGVoH8htG5fHn1KWXhRdPueAcoyApppZsPAPto,2020
407
406
  machineconfig/utils/schemas/repos/repos_types.py,sha256=ECVr-3IVIo8yjmYmVXX2mnDDN1SLSwvQIhx4KDDQHBQ,405
408
- machineconfig-4.8.dist-info/METADATA,sha256=U8vakfUTP6B1G5zxfxbaOXsqmyxo43_pNfhlnUscClM,7060
409
- machineconfig-4.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
410
- machineconfig-4.8.dist-info/entry_points.txt,sha256=BhKeN0HFu7k3izf4f-Xp95tU3wGAr-TJrCuxDnfUwWo,1006
411
- machineconfig-4.8.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
412
- machineconfig-4.8.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