machineconfig 8.14__py3-none-any.whl → 8.45__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.
- machineconfig/cluster/remote/run_cluster.py +1 -1
- machineconfig/cluster/remote/run_remote.py +1 -1
- machineconfig/cluster/sessions_managers/utils/maker.py +10 -8
- machineconfig/cluster/sessions_managers/wt_local.py +1 -1
- machineconfig/cluster/sessions_managers/wt_local_manager.py +1 -1
- machineconfig/cluster/sessions_managers/zellij_local.py +1 -1
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +1 -1
- machineconfig/jobs/installer/checks/check_installations.py +133 -0
- machineconfig/jobs/installer/checks/install_utils.py +132 -0
- machineconfig/jobs/installer/checks/report_utils.py +39 -0
- machineconfig/jobs/installer/checks/vt_utils.py +89 -0
- machineconfig/jobs/installer/installer_data.json +225 -140
- machineconfig/jobs/installer/linux_scripts/docker.sh +6 -9
- machineconfig/jobs/installer/package_groups.py +10 -9
- machineconfig/jobs/installer/python_scripts/boxes.py +1 -2
- machineconfig/jobs/installer/python_scripts/code.py +10 -8
- machineconfig/jobs/installer/python_scripts/hx.py +30 -13
- machineconfig/jobs/installer/python_scripts/nerfont_windows_helper.py +6 -5
- machineconfig/jobs/installer/python_scripts/sysabc.py +25 -19
- machineconfig/jobs/installer/python_scripts/yazi.py +33 -17
- machineconfig/jobs/scripts/powershell_scripts/cmatrix.ps1 +52 -0
- machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +1 -1
- machineconfig/jobs/scripts_dynamic/a.py +413 -10
- machineconfig/profile/create_links.py +77 -20
- machineconfig/profile/create_links_export.py +40 -51
- machineconfig/profile/mapper_data.toml +30 -0
- machineconfig/profile/mapper_dotfiles.toml +253 -0
- machineconfig/scripts/python/agents.py +70 -172
- machineconfig/scripts/python/ai/initai.py +3 -1
- machineconfig/scripts/python/ai/scripts/__init__.py +1 -0
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +2 -0
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +7 -5
- machineconfig/scripts/python/ai/solutions/claude/claude.py +1 -1
- machineconfig/scripts/python/ai/solutions/cline/cline.py +1 -1
- machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +1 -1
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +29 -0
- machineconfig/scripts/python/ai/solutions/crush/crush.py +1 -1
- machineconfig/scripts/python/ai/solutions/cursor/cursors.py +1 -1
- machineconfig/scripts/python/ai/solutions/gemini/gemini.py +1 -1
- machineconfig/scripts/python/ai/solutions/gemini/settings.json +3 -0
- machineconfig/scripts/python/ai/{solutions → utils}/generic.py +2 -15
- machineconfig/scripts/python/ai/utils/vscode_tasks.py +6 -3
- machineconfig/scripts/python/cloud.py +58 -11
- machineconfig/scripts/python/croshell.py +4 -156
- machineconfig/scripts/python/devops.py +57 -40
- machineconfig/scripts/python/devops_navigator.py +17 -3
- machineconfig/scripts/python/fire_jobs.py +8 -207
- machineconfig/scripts/python/ftpx.py +5 -225
- machineconfig/scripts/python/graph/cli_graph.json +8743 -0
- machineconfig/scripts/python/{env_manager → helper_env}/path_manager_tui.py +2 -2
- machineconfig/scripts/python/{env_manager → helpers/helper_env}/env_manager_tui.py +1 -1
- machineconfig/scripts/python/helpers/helper_env/path_manager_tui.py +228 -0
- machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.py +1 -1
- machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_cursor_agents.py +1 -1
- machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_gemini.py +1 -1
- machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_qwen.py +1 -1
- machineconfig/scripts/python/helpers/helpers_agents/agents_impl.py +168 -0
- machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_launch.py +5 -5
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_copy.py +6 -6
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_mount.py +10 -5
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_sync.py +3 -3
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers2.py +1 -1
- machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +225 -0
- machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/scheduler.py +4 -4
- machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/start_slidev.py +7 -6
- machineconfig/scripts/python/helpers/helpers_devops/backup_config.py +149 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_backup_retrieve.py +267 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +98 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +76 -0
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_nw.py +52 -72
- machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +265 -0
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_self.py +39 -23
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_file.py +44 -30
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_server.py +26 -43
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_terminal.py +12 -6
- machineconfig/scripts/python/helpers/helpers_devops/cli_ssh.py +167 -0
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_status.py +12 -6
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_update_repos.py +1 -1
- machineconfig/scripts/python/{interactive.py → helpers/helpers_devops/interactive.py} +68 -52
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/run_script.py +75 -58
- machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.ps1 +41 -0
- machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.sh +48 -0
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_wezterm_theme.py +3 -3
- machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_impl.py +233 -0
- machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_route_helper.py +3 -3
- machineconfig/scripts/python/helpers/helpers_msearch/msearch_impl.py +248 -0
- machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_linux/fzfg +4 -3
- machineconfig/scripts/python/helpers/helpers_msearch/scripts_linux/search_with_context.sh +48 -0
- machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_windows/fzfg.ps1 +1 -1
- machineconfig/scripts/python/helpers/helpers_navigator/__init__.py +20 -0
- machineconfig/scripts/python/helpers/helpers_navigator/cli_graph_loader.py +234 -0
- machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/command_builder.py +61 -13
- machineconfig/scripts/python/helpers/helpers_navigator/command_detail.py +153 -0
- machineconfig/scripts/python/helpers/helpers_navigator/command_tree.py +45 -0
- machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/data_models.py +18 -11
- machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/main_app.py +5 -5
- machineconfig/scripts/python/helpers/helpers_network/__init__.py +0 -0
- machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/address.py +15 -17
- machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/address_switch.py +1 -1
- machineconfig/scripts/python/helpers/helpers_network/ftpx_impl.py +276 -0
- machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/mount_ssh.py +2 -2
- machineconfig/scripts/python/helpers/helpers_network/ssh_add_identity.py +73 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh_add_ssh_key.py +175 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh_debug_linux.py +319 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh_debug_windows.py +275 -0
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action.py +3 -3
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action_helper.py +3 -3
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/cloud_repo_sync.py +116 -33
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/grource.py +3 -2
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/record.py +33 -13
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_2.py +63 -19
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/update.py +0 -6
- machineconfig/scripts/python/helpers/helpers_search/script_help.py +81 -0
- machineconfig/scripts/python/helpers/helpers_sessions/__init__.py +0 -0
- machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +177 -0
- machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +1 -1
- machineconfig/scripts/python/helpers/helpers_terminal/__init__.py +0 -0
- machineconfig/scripts/python/helpers/helpers_terminal/terminal_impl.py +96 -0
- machineconfig/scripts/python/{helpers_utils → helpers/helpers_utils}/download.py +1 -1
- machineconfig/scripts/python/{helpers_utils → helpers/helpers_utils}/python.py +46 -26
- machineconfig/scripts/python/helpers/helpers_utils/specs.py +246 -0
- machineconfig/scripts/python/mcfg_entry.py +133 -48
- machineconfig/scripts/python/msearch.py +15 -61
- machineconfig/scripts/python/sessions.py +59 -194
- machineconfig/scripts/python/terminal.py +18 -96
- machineconfig/scripts/python/utils.py +101 -20
- machineconfig/settings/atuin/config.toml +294 -0
- machineconfig/settings/atuin/themes/catppuccin-mocha-mauve.toml +12 -0
- machineconfig/settings/linters/.ruff.toml +1 -0
- machineconfig/settings/mprocs/windows/mprocs.yaml +2 -2
- machineconfig/settings/shells/bash/init.sh +6 -3
- machineconfig/settings/shells/pwsh/init.ps1 +69 -1
- machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
- machineconfig/settings/shells/wezterm/wezterm.lua +4 -1
- machineconfig/settings/shells/wt/settings.json +20 -7
- machineconfig/settings/shells/zsh/init.sh +34 -4
- machineconfig/settings/television/cable_unix/bash-history.toml +1 -1
- machineconfig/settings/television/cable_windows/pwsh-history.toml +1 -1
- machineconfig/settings/tv/config.toml +234 -0
- machineconfig/settings/tv/themes/catppuccin-mocha-sky.toml +22 -0
- machineconfig/settings/wsl/.wslconfig +5 -30
- machineconfig/settings/yazi/yazi_linux.toml +18 -8
- machineconfig/settings/zellij/layouts/st.kdl +2 -2
- machineconfig/settings/zellij/layouts/st2.kdl +1 -1
- machineconfig/setup_linux/web_shortcuts/interactive.sh +10 -10
- machineconfig/setup_linux/web_shortcuts/live_from_github.sh +3 -0
- machineconfig/setup_mac/__init__.py +0 -2
- machineconfig/setup_windows/__init__.py +0 -1
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +14 -13
- machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +4 -3
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +3 -3
- machineconfig/type_hinting/sql/__init__.py +1 -0
- machineconfig/type_hinting/sql/base.py +216 -0
- machineconfig/type_hinting/sql/core_schema.py +64 -0
- machineconfig/type_hinting/sql/core_schema_typeddict.py +41 -0
- machineconfig/type_hinting/sql/typeddict_codegen.py +222 -0
- machineconfig/type_hinting/typedict/__init__.py +1 -0
- machineconfig/type_hinting/typedict/ast_utils.py +130 -0
- machineconfig/type_hinting/typedict/generator_helpers.py +319 -0
- machineconfig/type_hinting/typedict/generators.py +231 -0
- machineconfig/type_hinting/typedict/polars_schema.py +24 -0
- machineconfig/type_hinting/typedict/polars_schema_typeddict.py +63 -0
- machineconfig/utils/accessories.py +24 -0
- machineconfig/utils/code.py +41 -13
- machineconfig/utils/files/ascii_art.py +10 -14
- machineconfig/utils/files/headers.py +3 -5
- machineconfig/utils/files/read.py +8 -1
- machineconfig/utils/installer_utils/github_release_bulk.py +1 -0
- machineconfig/utils/installer_utils/install_from_url.py +1 -1
- machineconfig/utils/installer_utils/installer_class.py +12 -4
- machineconfig/utils/installer_utils/installer_cli.py +1 -15
- machineconfig/utils/installer_utils/installer_helper.py +2 -2
- machineconfig/utils/installer_utils/installer_locator_utils.py +13 -13
- machineconfig/utils/installer_utils/installer_runner.py +4 -4
- machineconfig/utils/meta.py +6 -4
- machineconfig/utils/options.py +49 -19
- machineconfig/utils/options_utils/__init__.py +0 -0
- machineconfig/utils/options_utils/options_tv_linux.py +211 -0
- machineconfig/utils/options_utils/options_tv_windows.py +88 -0
- machineconfig/utils/options_utils/tv_options.py +37 -0
- machineconfig/utils/path_extended.py +6 -6
- machineconfig/utils/scheduler.py +8 -2
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
- machineconfig/utils/source_of_truth.py +6 -1
- machineconfig/utils/ssh.py +69 -18
- machineconfig/utils/ssh_utils/abc.py +1 -1
- machineconfig/utils/ssh_utils/wsl.py +107 -170
- machineconfig/utils/ssh_utils/wsl_helper.py +217 -0
- machineconfig/utils/upgrade_packages.py +4 -8
- {machineconfig-8.14.dist-info → machineconfig-8.45.dist-info}/METADATA +29 -22
- {machineconfig-8.14.dist-info → machineconfig-8.45.dist-info}/RECORD +247 -208
- machineconfig/jobs/installer/check_installations.py +0 -248
- machineconfig/profile/backup.toml +0 -49
- machineconfig/profile/mapper.toml +0 -263
- machineconfig/scripts/python/helpers_devops/cli_config.py +0 -105
- machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +0 -89
- machineconfig/scripts/python/helpers_devops/cli_data.py +0 -25
- machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -208
- machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +0 -80
- machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +0 -3
- machineconfig/scripts/python/helpers_navigator/__init__.py +0 -20
- machineconfig/scripts/python/helpers_navigator/command_detail.py +0 -44
- machineconfig/scripts/python/helpers_navigator/command_tree.py +0 -620
- machineconfig/scripts/python/helpers_network/ssh_add_identity.py +0 -116
- machineconfig/scripts/python/helpers_network/ssh_add_ssh_key.py +0 -153
- machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +0 -391
- machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +0 -338
- machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -77
- machineconfig/setup_mac/ssh/openssh_setup.sh +0 -114
- machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -29
- machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -37
- machineconfig/utils/options_tv.py +0 -119
- machineconfig/utils/tst.py +0 -20
- /machineconfig/{scripts/python/helpers_agents → jobs/installer/checks}/__init__.py +0 -0
- /machineconfig/scripts/python/ai/{solutions/_shared.py → utils/shared.py} +0 -0
- /machineconfig/scripts/python/{helpers_agents/agentic_frameworks → graph}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_cloud → helpers}/__init__.py +0 -0
- /machineconfig/scripts/python/{env_manager → helpers/helper_env}/__init__.py +0 -0
- /machineconfig/scripts/python/{env_manager → helpers/helper_env}/path_manager_backend.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_agents}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_devops → helpers/helpers_agents/agentic_frameworks}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.json +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_search.py +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_helper_types.py +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_load_balancer.py +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/privacy/configs/aichat/config.yaml +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/privacy/configs/aider/.aider.conf.yml +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/privacy/configs/copilot/config.yml +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/privacy/configs/crush/crush.json +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/privacy/configs/gemini/settings.json +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/privacy/privacy.py +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/prompt.txt +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.ps1 +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.sh +0 -0
- /machineconfig/scripts/python/{helpers_devops/themes → helpers/helpers_cloud}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_helpers.py +0 -0
- /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers5.py +0 -0
- /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_croshell}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/crosh.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/pomodoro.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer_template.py +0 -0
- /machineconfig/scripts/python/{helpers_network → helpers/helpers_devops}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_sessions → helpers/helpers_devops/themes}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
- /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → helpers/helpers_fire_command/__init__.py} +0 -0
- /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/cloud_manager.py +0 -0
- /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/f.py +0 -0
- /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/file_wrangler.py +0 -0
- /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_args_helper.py +0 -0
- /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_streamlit_helper.py +0 -0
- /machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/search_bar.py +0 -0
- /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/mount_nfs.py +0 -0
- /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/mount_nw_drive.py +0 -0
- /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/onetimeshare.py +0 -0
- /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/wifi_conn.py +0 -0
- /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/clone.py +0 -0
- /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_1.py +0 -0
- /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/sync.py +0 -0
- /machineconfig/scripts/python/helpers/{ast_search.py → helpers_search/ast_search.py} +0 -0
- /machineconfig/scripts/python/helpers/{qr_code.py → helpers_search/qr_code.py} +0 -0
- /machineconfig/scripts/python/helpers/{repo_rag.py → helpers_search/repo_rag.py} +0 -0
- /machineconfig/scripts/python/helpers/{symantic_search.py → helpers_search/symantic_search.py} +0 -0
- /machineconfig/scripts/python/{helpers_utils → helpers/helpers_utils}/pdf.py +0 -0
- {machineconfig-8.14.dist-info → machineconfig-8.45.dist-info}/WHEEL +0 -0
- {machineconfig-8.14.dist-info → machineconfig-8.45.dist-info}/entry_points.txt +0 -0
- {machineconfig-8.14.dist-info → machineconfig-8.45.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import platform
|
|
3
|
+
import stat
|
|
4
|
+
import shutil
|
|
5
|
+
import subprocess
|
|
6
|
+
from pathlib import Path, PureWindowsPath
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def ensure_relative_path(requested: Path | str) -> Path:
|
|
10
|
+
path = Path(requested)
|
|
11
|
+
if path.is_absolute():
|
|
12
|
+
raise ValueError("paths must be relative to the home directory")
|
|
13
|
+
if any(part == ".." for part in path.parts):
|
|
14
|
+
raise ValueError("paths must stay within the home directory")
|
|
15
|
+
return path
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def remove_path(path: Path) -> None:
|
|
19
|
+
if path.is_symlink() or path.is_file():
|
|
20
|
+
path.unlink()
|
|
21
|
+
return
|
|
22
|
+
shutil.rmtree(path)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def ensure_wsl_environment() -> None:
|
|
26
|
+
if os.environ.get("WSL_DISTRO_NAME"):
|
|
27
|
+
return
|
|
28
|
+
if "microsoft" in platform.release().lower():
|
|
29
|
+
return
|
|
30
|
+
raise RuntimeError("copy_when_inside_wsl must run inside WSL")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def ensure_windows_environment() -> None:
|
|
34
|
+
if os.name != "nt":
|
|
35
|
+
raise RuntimeError("copy_when_inside_windows must run inside Windows")
|
|
36
|
+
if os.environ.get("WSL_DISTRO_NAME"):
|
|
37
|
+
raise RuntimeError("copy_when_inside_windows must run inside Windows")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def ensure_linux_environment() -> None:
|
|
41
|
+
if platform.system() != "Linux":
|
|
42
|
+
raise RuntimeError("change_ssh_port requires Linux environment")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def infer_windows_home_from_permissions(windows_username: str | None) -> Path:
|
|
46
|
+
base_dir = Path("/mnt/c/Users")
|
|
47
|
+
try:
|
|
48
|
+
entries = list(base_dir.iterdir())
|
|
49
|
+
except FileNotFoundError as exc:
|
|
50
|
+
raise RuntimeError("unable to find /mnt/c/Users") from exc
|
|
51
|
+
if windows_username:
|
|
52
|
+
candidate = base_dir / windows_username
|
|
53
|
+
if candidate.is_dir():
|
|
54
|
+
return candidate
|
|
55
|
+
raise RuntimeError(f"specified Windows user directory not found: {candidate}")
|
|
56
|
+
candidates: list[Path] = []
|
|
57
|
+
for entry in entries:
|
|
58
|
+
if not entry.is_dir():
|
|
59
|
+
continue
|
|
60
|
+
if entry.name.lower() == "public" or entry.name.lower() == "all users":
|
|
61
|
+
continue
|
|
62
|
+
try:
|
|
63
|
+
mode = stat.S_IMODE(entry.stat().st_mode)
|
|
64
|
+
except OSError:
|
|
65
|
+
continue
|
|
66
|
+
if mode == 0o777:
|
|
67
|
+
candidates.append(entry)
|
|
68
|
+
if len(candidates) != 1:
|
|
69
|
+
wsl_user = os.environ.get("USER") or os.environ.get("LOGNAME")
|
|
70
|
+
if wsl_user:
|
|
71
|
+
for candidate in candidates:
|
|
72
|
+
if candidate.name == wsl_user:
|
|
73
|
+
return candidate
|
|
74
|
+
non_default = [c for c in candidates if c.name.lower() not in ("default", "default user")]
|
|
75
|
+
if len(non_default) == 1:
|
|
76
|
+
return non_default[0]
|
|
77
|
+
options = ", ".join(sorted(candidate.name for candidate in candidates)) or "none"
|
|
78
|
+
raise RuntimeError(f"unable to infer Windows home directory (candidates: {options})")
|
|
79
|
+
return candidates[0]
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def resolve_windows_home_from_wsl(windows_username: str | None) -> Path:
|
|
83
|
+
if windows_username:
|
|
84
|
+
return infer_windows_home_from_permissions(windows_username)
|
|
85
|
+
user_profile = os.environ.get("USERPROFILE")
|
|
86
|
+
if user_profile:
|
|
87
|
+
windows_path = PureWindowsPath(user_profile)
|
|
88
|
+
drive = windows_path.drive
|
|
89
|
+
if drive:
|
|
90
|
+
drive_letter = drive.rstrip(":").lower()
|
|
91
|
+
tail = Path(*windows_path.parts[1:])
|
|
92
|
+
candidate = Path("/mnt") / drive_letter / tail
|
|
93
|
+
if candidate.exists():
|
|
94
|
+
return candidate
|
|
95
|
+
return infer_windows_home_from_permissions(windows_username)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def decode_wsl_output(raw_bytes: bytes) -> str:
|
|
99
|
+
try:
|
|
100
|
+
return raw_bytes.decode("utf-16-le")
|
|
101
|
+
except UnicodeDecodeError:
|
|
102
|
+
return raw_bytes.decode()
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def get_single_wsl_distribution() -> str:
|
|
106
|
+
process = subprocess.run(["wsl.exe", "-l"], capture_output=True, text=False, check=True)
|
|
107
|
+
stdout = decode_wsl_output(process.stdout).replace("\ufeff", "")
|
|
108
|
+
distributions: list[str] = []
|
|
109
|
+
for raw_line in stdout.splitlines():
|
|
110
|
+
line = raw_line.strip()
|
|
111
|
+
if not line or line.lower().startswith("windows subsystem for linux"):
|
|
112
|
+
continue
|
|
113
|
+
normalized = line.lstrip("* ").replace("(Default)", "").strip()
|
|
114
|
+
if normalized:
|
|
115
|
+
distributions.append(normalized)
|
|
116
|
+
if len(distributions) != 1:
|
|
117
|
+
raise RuntimeError("unable to pick a single WSL distribution")
|
|
118
|
+
return distributions[0]
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def resolve_wsl_home_on_windows() -> Path:
|
|
122
|
+
distribution = get_single_wsl_distribution()
|
|
123
|
+
home_root = Path(rf"\\wsl$\{distribution}\home")
|
|
124
|
+
try:
|
|
125
|
+
entries = list(home_root.iterdir())
|
|
126
|
+
except FileNotFoundError as exc:
|
|
127
|
+
raise RuntimeError(f"unable to locate WSL home directories for {distribution}") from exc
|
|
128
|
+
except OSError as exc:
|
|
129
|
+
raise RuntimeError(f"unable to inspect WSL home directories for {distribution}") from exc
|
|
130
|
+
user_dirs = [entry for entry in entries if entry.is_dir()]
|
|
131
|
+
if len(user_dirs) != 1:
|
|
132
|
+
options = ", ".join(sorted(entry.name for entry in user_dirs)) or "none"
|
|
133
|
+
raise RuntimeError(f"unable to infer WSL user directory (candidates: {options})")
|
|
134
|
+
return user_dirs[0]
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def quote_for_powershell(path: Path) -> str:
|
|
138
|
+
return "'" + str(path).replace("'", "''") + "'"
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def run_windows_copy_command(source_path: Path, target_path: Path) -> None:
|
|
142
|
+
source_is_dir = source_path.is_dir()
|
|
143
|
+
parent_literal = quote_for_powershell(target_path.parent)
|
|
144
|
+
source_literal = quote_for_powershell(source_path)
|
|
145
|
+
target_literal = quote_for_powershell(target_path)
|
|
146
|
+
script = (
|
|
147
|
+
"$ErrorActionPreference = 'Stop'; "
|
|
148
|
+
f"New-Item -ItemType Directory -Path {parent_literal} -Force | Out-Null; "
|
|
149
|
+
f"Copy-Item -LiteralPath {source_literal} -Destination {target_literal}"
|
|
150
|
+
f"{' -Recurse' if source_is_dir else ''} -Force"
|
|
151
|
+
)
|
|
152
|
+
print(f"Copying {source_path} to {target_path}")
|
|
153
|
+
subprocess.run(["powershell.exe", "-NoLogo", "-NoProfile", "-Command", script], check=True)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def ensure_symlink(link_path: Path, target_path: Path) -> bool:
|
|
157
|
+
if not target_path.exists():
|
|
158
|
+
raise FileNotFoundError(target_path)
|
|
159
|
+
if link_path.is_symlink():
|
|
160
|
+
existing_target = Path(os.path.realpath(link_path))
|
|
161
|
+
desired_target = Path(os.path.realpath(target_path))
|
|
162
|
+
if os.path.normcase(str(existing_target)) == os.path.normcase(str(desired_target)):
|
|
163
|
+
return False
|
|
164
|
+
link_path.unlink()
|
|
165
|
+
elif link_path.exists():
|
|
166
|
+
raise FileExistsError(link_path)
|
|
167
|
+
link_path.symlink_to(target_path, target_is_directory=True)
|
|
168
|
+
return True
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def parse_port_spec(port_spec: str) -> list[int]:
|
|
172
|
+
ports: list[int] = []
|
|
173
|
+
for part in port_spec.split(","):
|
|
174
|
+
part = part.strip()
|
|
175
|
+
if not part:
|
|
176
|
+
continue
|
|
177
|
+
if "-" in part:
|
|
178
|
+
range_parts = part.split("-", maxsplit=1)
|
|
179
|
+
start = int(range_parts[0].strip())
|
|
180
|
+
end = int(range_parts[1].strip())
|
|
181
|
+
if start > end:
|
|
182
|
+
raise ValueError(f"Invalid port range: {part} (start > end)")
|
|
183
|
+
ports.extend(range(start, end + 1))
|
|
184
|
+
else:
|
|
185
|
+
ports.append(int(part))
|
|
186
|
+
return ports
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def normalize_port_spec_for_firewall(port_spec: str) -> tuple[str, str]:
|
|
190
|
+
"""Validates and normalizes port spec for New-NetFirewallRule -LocalPort parameter.
|
|
191
|
+
Returns (normalized_spec, human_readable_description).
|
|
192
|
+
New-NetFirewallRule natively supports ranges (e.g. '5000-5020') and comma-separated values.
|
|
193
|
+
"""
|
|
194
|
+
parts: list[str] = []
|
|
195
|
+
for raw_part in port_spec.split(","):
|
|
196
|
+
part = raw_part.strip()
|
|
197
|
+
if not part:
|
|
198
|
+
continue
|
|
199
|
+
if "-" in part:
|
|
200
|
+
range_parts = part.split("-", maxsplit=1)
|
|
201
|
+
start = int(range_parts[0].strip())
|
|
202
|
+
end = int(range_parts[1].strip())
|
|
203
|
+
if start < 1 or start > 65535 or end < 1 or end > 65535:
|
|
204
|
+
raise ValueError(f"Port numbers must be between 1 and 65535: {part}")
|
|
205
|
+
if start > end:
|
|
206
|
+
raise ValueError(f"Invalid port range: {part} (start > end)")
|
|
207
|
+
parts.append(f"{start}-{end}")
|
|
208
|
+
else:
|
|
209
|
+
port = int(part)
|
|
210
|
+
if port < 1 or port > 65535:
|
|
211
|
+
raise ValueError(f"Invalid port number: {port}")
|
|
212
|
+
parts.append(str(port))
|
|
213
|
+
if not parts:
|
|
214
|
+
raise ValueError("No valid ports provided")
|
|
215
|
+
normalized = ",".join(parts)
|
|
216
|
+
description = normalized.replace(",", ", ")
|
|
217
|
+
return normalized, description
|
|
@@ -33,21 +33,21 @@ def generate_uv_add_commands(pyproject_path: Path, output_path: Path) -> None:
|
|
|
33
33
|
if "project" in pyproject_data and "dependencies" in pyproject_data["project"]:
|
|
34
34
|
main_deps: list[str] = pyproject_data["project"]["dependencies"]
|
|
35
35
|
if main_deps:
|
|
36
|
-
package_names: list[str] = [extract_package_name(dep) for dep in main_deps]
|
|
36
|
+
package_names: list[str] = [f"'{extract_package_name(dep)}'" for dep in main_deps]
|
|
37
37
|
commands.append(f"uv add --no-cache {' '.join(package_names)}")
|
|
38
38
|
|
|
39
39
|
if "project" in pyproject_data and "optional-dependencies" in pyproject_data["project"]:
|
|
40
40
|
optional_deps: dict[str, list[str]] = pyproject_data["project"]["optional-dependencies"]
|
|
41
41
|
for group_name, deps in optional_deps.items():
|
|
42
42
|
if deps:
|
|
43
|
-
package_names = [extract_package_name(dep) for dep in deps]
|
|
43
|
+
package_names = [f"'{extract_package_name(dep)}'" for dep in deps]
|
|
44
44
|
commands.append(f"uv add --no-cache --group {group_name} {' '.join(package_names)}")
|
|
45
45
|
|
|
46
46
|
if "dependency-groups" in pyproject_data:
|
|
47
47
|
dep_groups: dict[str, list[str]] = pyproject_data["dependency-groups"]
|
|
48
48
|
for group_name, deps in dep_groups.items():
|
|
49
49
|
if deps:
|
|
50
|
-
package_names = [extract_package_name(dep) for dep in deps]
|
|
50
|
+
package_names = [f"'{extract_package_name(dep)}'" for dep in deps]
|
|
51
51
|
if group_name == "dev":
|
|
52
52
|
commands.append(f"uv add --no-cache --dev {' '.join(package_names)}")
|
|
53
53
|
else:
|
|
@@ -78,12 +78,8 @@ def extract_package_name(dependency_spec: str) -> str:
|
|
|
78
78
|
"rich>=14.0.0" -> "rich"
|
|
79
79
|
"requests>=2.32.5" -> "requests"
|
|
80
80
|
"pywin32" -> "pywin32"
|
|
81
|
-
"package[extra]>=1.0" -> "package"
|
|
81
|
+
"package[extra]>=1.0" -> "package[extra]"
|
|
82
82
|
"""
|
|
83
|
-
# Handle extras like "package[extra]>=1.0" first
|
|
84
|
-
if "[" in dependency_spec:
|
|
85
|
-
dependency_spec = dependency_spec.split("[")[0].strip()
|
|
86
|
-
|
|
87
83
|
# Split on common version operators and take the first part
|
|
88
84
|
for operator in [">=", "<=", "==", "!=", ">", "<", "~=", "===", "@"]:
|
|
89
85
|
if operator in dependency_spec:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: machineconfig
|
|
3
|
-
Version: 8.
|
|
3
|
+
Version: 8.45
|
|
4
4
|
Summary: Dotfiles management package
|
|
5
5
|
Author-email: Alex Al-Saffar <programmer@usa.com>
|
|
6
6
|
License: Apache 2.0
|
|
@@ -11,20 +11,20 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
|
11
11
|
Classifier: Operating System :: OS Independent
|
|
12
12
|
Requires-Python: >=3.13
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
|
-
Requires-Dist: cryptography>=
|
|
15
|
-
Requires-Dist: fire>=0.7.
|
|
14
|
+
Requires-Dist: cryptography>=46.0.3
|
|
15
|
+
Requires-Dist: fire>=0.7.1
|
|
16
|
+
Requires-Dist: gitpython>=3.1.45
|
|
16
17
|
Requires-Dist: joblib>=1.5.2
|
|
17
|
-
Requires-Dist: paramiko>=
|
|
18
|
+
Requires-Dist: paramiko>=4.0.0
|
|
19
|
+
Requires-Dist: psutil>=7.1.3
|
|
20
|
+
Requires-Dist: questionary>=2.1.1
|
|
18
21
|
Requires-Dist: randomname>=0.2.1
|
|
22
|
+
Requires-Dist: rclone-python>=0.1.23
|
|
19
23
|
Requires-Dist: requests>=2.32.5
|
|
20
|
-
Requires-Dist: rich>=14.
|
|
24
|
+
Requires-Dist: rich>=14.2.0
|
|
21
25
|
Requires-Dist: tenacity>=9.1.2
|
|
22
|
-
Requires-Dist:
|
|
23
|
-
Requires-Dist:
|
|
24
|
-
Requires-Dist: rclone-python>=0.1.23
|
|
25
|
-
Requires-Dist: questionary>=2.1.1
|
|
26
|
-
Requires-Dist: typer-slim>=0.19.2
|
|
27
|
-
Requires-Dist: typer>=0.19.2
|
|
26
|
+
Requires-Dist: typer==0.20.0
|
|
27
|
+
Requires-Dist: typer-slim==0.20.0
|
|
28
28
|
Provides-Extra: windows
|
|
29
29
|
Requires-Dist: pywin32; extra == "windows"
|
|
30
30
|
Provides-Extra: plot
|
|
@@ -50,14 +50,15 @@ Requires-Dist: python-magic>=0.4.27; extra == "plot"
|
|
|
50
50
|
</p>
|
|
51
51
|
|
|
52
52
|
|
|
53
|
-
#
|
|
53
|
+
# 🗜 Welcome to **Machineconfig**
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
Your stack is awesome, but you need a stack manager, to have a tight grip over it, put it together and maintain it.
|
|
56
|
+
Entering, **Machineconfig**, a cli-based cross-platform **Stack Manager** — It is a swiss-army knife; a *Package Manager*, *Configuration Manager*, *Automation Tool*, *Dotfiles Manager*, *Data Solution*, and *Code Manager*, among other functionalities covered, all rolled into one seamless experience, that is consistent across different platforms.
|
|
56
57
|
|
|
57
58
|
|
|
58
|
-
##
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
## Workflow:
|
|
60
|
+
What is your stack? Say you have a new computer/ VM, how do you go about setting it up with your stack?
|
|
61
|
+
Surely, you have:
|
|
61
62
|
* A bunch of CLI tools.
|
|
62
63
|
* [Optional] A bunch of softwares (GUIs for desktop environment)
|
|
63
64
|
* [Public] A bunch of configuration files for your tools.
|
|
@@ -100,22 +101,28 @@ Machineconfig builds on shoulder of giants. A suite of best-in-class stack of pr
|
|
|
100
101
|
# Install On Windows:
|
|
101
102
|
|
|
102
103
|
```powershell
|
|
103
|
-
# install tool the tool only:
|
|
104
104
|
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" # Skip if UV is already installed
|
|
105
105
|
uv tool install --upgrade --python 3.14 machineconfig
|
|
106
|
-
# interactive install of machineconfig and following on to run it and make basic machine configuration (RECOMMENDED):
|
|
107
|
-
iex (iwr bit.ly/cfgwindows).Content # Or, if UV is installed: iex (uvx machineconfig define)
|
|
108
|
-
# Quick install and configure (optionals are accepted by default):
|
|
109
|
-
iex (iwr bit.ly/cfgwq).Content
|
|
110
106
|
```
|
|
111
107
|
|
|
112
108
|
|
|
113
109
|
# Install On Linux and MacOS
|
|
114
110
|
|
|
115
111
|
```bash
|
|
116
|
-
# install the tool only:
|
|
117
112
|
curl -LsSf https://astral.sh/uv/install.sh | sh # Skip if UV is already installed
|
|
118
113
|
uv tool install --upgrade --python 3.14 machineconfig
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
# Quickies ...
|
|
118
|
+
```powershell
|
|
119
|
+
# interactive install of machineconfig and following on to run it and make basic machine configuration (RECOMMENDED):
|
|
120
|
+
irm bit.ly/cfgwindows | iex # Or, if UV is installed: iex (uvx machineconfig define)
|
|
121
|
+
# Quick install and configure (optionals are accepted by default):
|
|
122
|
+
irm bit.ly/cfgwq | iex
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
```bash
|
|
119
126
|
# interactive install of machineconfig and following on to run it and make basic machine configuration (RECOMMENDED):
|
|
120
127
|
. <(curl -L bit.ly/cfglinux) # Or, if UV is installed: . <(uvx machineconfig define)
|
|
121
128
|
```
|