machineconfig 6.82__py3-none-any.whl → 7.98__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.
- machineconfig/cluster/remote/cloud_manager.py +1 -1
- machineconfig/cluster/sessions_managers/utils/maker.py +25 -13
- machineconfig/cluster/sessions_managers/wt_local.py +16 -221
- machineconfig/cluster/sessions_managers/wt_local_manager.py +55 -193
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
- machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
- machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
- machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
- machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +3 -1
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
- machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +2 -2
- machineconfig/jobs/installer/custom/boxes.py +2 -2
- machineconfig/jobs/installer/custom/hx.py +75 -18
- machineconfig/jobs/installer/custom/yazi.py +119 -0
- machineconfig/jobs/installer/custom_dev/brave.py +5 -3
- machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/custom_dev/code.py +4 -1
- machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +1 -1
- machineconfig/jobs/installer/custom_dev/nerdfont.py +1 -1
- machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +27 -22
- machineconfig/jobs/installer/custom_dev/sysabc.py +139 -0
- machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
- machineconfig/jobs/installer/custom_dev/winget.py +10 -14
- machineconfig/jobs/installer/installer_data.json +1287 -216
- machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
- machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
- machineconfig/jobs/installer/package_groups.py +58 -89
- machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
- machineconfig/logger.py +0 -1
- machineconfig/profile/create_helper.py +43 -16
- machineconfig/profile/create_links.py +2 -1
- machineconfig/profile/create_links_export.py +64 -18
- machineconfig/profile/create_shell_profile.py +78 -127
- machineconfig/profile/mapper.toml +15 -8
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/wrap_mcfg +46 -0
- machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
- machineconfig/scripts/python/agents.py +52 -37
- machineconfig/scripts/python/ai/initai.py +1 -1
- machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
- machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
- machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -0
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
- machineconfig/scripts/python/ai/solutions/generic.py +1 -1
- machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
- machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +7 -2
- machineconfig/scripts/python/croshell.py +77 -78
- machineconfig/scripts/python/devops.py +39 -21
- machineconfig/scripts/python/devops_navigator.py +0 -4
- machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
- machineconfig/scripts/python/env_manager/path_manager_tui.py +1 -1
- machineconfig/scripts/python/fire_jobs.py +84 -115
- machineconfig/scripts/python/ftpx.py +42 -16
- machineconfig/scripts/python/helpers/ast_search.py +74 -0
- machineconfig/scripts/python/helpers/qr_code.py +166 -0
- machineconfig/scripts/python/helpers/repo_rag.py +325 -0
- machineconfig/scripts/python/helpers/run_py_script.py +79 -0
- machineconfig/scripts/python/helpers/symantic_search.py +25 -0
- machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +26 -0
- machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
- machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
- machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_launch.py +32 -13
- machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_helper_types.py +11 -14
- machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
- machineconfig/scripts/python/helpers_agents/templates/template.sh +32 -0
- machineconfig/scripts/python/helpers_cloud/cloud_copy.py +28 -21
- machineconfig/scripts/python/helpers_cloud/cloud_helpers.py +1 -1
- machineconfig/scripts/python/helpers_cloud/cloud_mount.py +19 -17
- machineconfig/scripts/python/helpers_cloud/cloud_sync.py +8 -7
- machineconfig/scripts/python/helpers_croshell/crosh.py +3 -3
- machineconfig/scripts/python/helpers_croshell/start_slidev.py +6 -7
- machineconfig/scripts/python/helpers_devops/cli_config.py +46 -61
- machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +67 -55
- machineconfig/scripts/python/helpers_devops/cli_nw.py +157 -16
- machineconfig/scripts/python/helpers_devops/cli_repos.py +55 -21
- machineconfig/scripts/python/helpers_devops/cli_self.py +98 -48
- machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
- machineconfig/scripts/python/helpers_devops/cli_share_server.py +80 -42
- machineconfig/scripts/python/helpers_devops/{cli_terminal.py → cli_share_terminal.py} +15 -17
- machineconfig/scripts/python/helpers_devops/cli_utils.py +3 -128
- machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +4 -4
- machineconfig/scripts/python/helpers_devops/devops_status.py +7 -19
- machineconfig/scripts/python/helpers_devops/themes/choose_wezterm_theme.py +1 -1
- machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +26 -16
- machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
- machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
- machineconfig/scripts/python/helpers_navigator/command_tree.py +50 -18
- machineconfig/scripts/python/helpers_network/address.py +132 -0
- machineconfig/scripts/python/{nw → helpers_network}/devops_add_ssh_key.py +24 -5
- machineconfig/scripts/python/{nw → helpers_network}/mount_nfs +0 -1
- machineconfig/scripts/python/{nw → helpers_network}/mount_nfs.py +2 -2
- machineconfig/scripts/python/{nw → helpers_network}/mount_ssh.py +1 -1
- machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_linux.py +7 -7
- machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_windows.py +4 -4
- machineconfig/scripts/python/{nw → helpers_network}/wifi_conn.py +1 -53
- machineconfig/scripts/python/{nw → helpers_network}/wsl_windows_transfer.py +3 -2
- machineconfig/scripts/python/helpers_repos/clone.py +0 -1
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +46 -19
- machineconfig/scripts/python/helpers_repos/entrypoint.py +2 -1
- machineconfig/scripts/python/helpers_repos/grource.py +1 -1
- machineconfig/scripts/python/helpers_repos/record.py +2 -1
- machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
- machineconfig/scripts/python/helpers_repos/{count_lines.py → repo_analyzer_2.py} +113 -192
- machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +20 -13
- machineconfig/scripts/python/helpers_utils/download.py +150 -0
- machineconfig/scripts/python/helpers_utils/path.py +185 -0
- machineconfig/scripts/python/interactive.py +19 -26
- machineconfig/scripts/python/{mcfg.py → mcfg_entry.py} +10 -0
- machineconfig/scripts/python/msearch.py +71 -0
- machineconfig/scripts/python/sessions.py +94 -25
- machineconfig/scripts/python/terminal.py +133 -0
- machineconfig/scripts/python/utils.py +28 -30
- machineconfig/scripts/windows/mounts/mount_ssh.ps1 +1 -1
- machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
- machineconfig/settings/broot/conf.toml +1 -1
- machineconfig/settings/helix/config.toml +16 -0
- machineconfig/settings/helix/languages.toml +13 -4
- machineconfig/settings/helix/yazi-picker.sh +12 -0
- machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
- machineconfig/settings/lf/linux/exe/previewer.sh +3 -2
- machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
- machineconfig/settings/lf/windows/lfrc +14 -16
- machineconfig/settings/marimo/marimo.toml +1 -1
- machineconfig/settings/marimo/snippets/globalize.py +34 -0
- machineconfig/settings/shells/bash/init.sh +43 -11
- machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
- machineconfig/settings/shells/nushell/config.nu +2 -32
- machineconfig/settings/shells/nushell/env.nu +45 -6
- machineconfig/settings/shells/nushell/init.nu +314 -0
- machineconfig/settings/shells/pwsh/init.ps1 +40 -14
- machineconfig/settings/shells/starship/starship.toml +16 -0
- machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
- machineconfig/settings/shells/wt/settings.json +14 -5
- machineconfig/settings/shells/zsh/init.sh +17 -19
- machineconfig/settings/television/cable_unix/alias.toml +8 -0
- machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
- machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
- machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
- machineconfig/settings/television/cable_unix/channels.toml +19 -0
- machineconfig/settings/television/cable_unix/dirs.toml +13 -0
- machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
- machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
- machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
- machineconfig/settings/television/cable_unix/env.toml +17 -0
- machineconfig/settings/television/cable_unix/files.toml +11 -0
- machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
- machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
- machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
- machineconfig/settings/television/cable_unix/git-log.toml +12 -0
- machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
- machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
- machineconfig/settings/television/cable_unix/guix.toml +20 -0
- machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
- machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
- machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
- machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
- machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
- machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
- machineconfig/settings/television/cable_unix/procs.toml +20 -0
- machineconfig/settings/television/cable_unix/text.toml +17 -0
- machineconfig/settings/television/cable_unix/tldr.toml +18 -0
- machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
- machineconfig/settings/television/cable_windows/alias.toml +7 -0
- machineconfig/settings/television/cable_windows/dirs.toml +13 -0
- machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
- machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
- machineconfig/settings/television/cable_windows/env.toml +17 -0
- machineconfig/settings/television/cable_windows/files.toml +14 -0
- machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
- machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
- machineconfig/settings/television/cable_windows/git-log.toml +11 -0
- machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
- machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
- machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
- machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
- machineconfig/settings/television/cable_windows/text.toml +17 -0
- machineconfig/settings/yazi/init.lua +61 -0
- machineconfig/settings/yazi/keymap_linux.toml +94 -0
- machineconfig/settings/yazi/keymap_windows.toml +78 -0
- machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
- machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
- machineconfig/settings/yazi/theme.toml +4 -0
- machineconfig/settings/yazi/yazi_linux.toml +84 -0
- machineconfig/settings/yazi/yazi_windows.toml +58 -0
- machineconfig/setup_linux/__init__.py +2 -1
- machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -12
- machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
- machineconfig/setup_mac/__init__.py +2 -3
- machineconfig/setup_mac/apps_gui.sh +248 -0
- machineconfig/setup_windows/__init__.py +3 -3
- machineconfig/setup_windows/uv.ps1 +8 -1
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +26 -11
- machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
- machineconfig/utils/accessories.py +7 -4
- machineconfig/utils/code.py +99 -32
- machineconfig/utils/files/ascii_art.py +1 -1
- machineconfig/utils/files/headers.py +3 -2
- machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
- machineconfig/utils/installer_utils/install_from_url.py +183 -0
- machineconfig/utils/installer_utils/installer_class.py +42 -99
- machineconfig/utils/installer_utils/installer_cli.py +175 -0
- machineconfig/utils/installer_utils/installer_helper.py +129 -0
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +36 -85
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +16 -61
- machineconfig/utils/io.py +69 -1
- machineconfig/utils/links.py +56 -38
- machineconfig/utils/meta.py +33 -18
- machineconfig/utils/options.py +46 -18
- machineconfig/utils/options_tv.py +119 -0
- machineconfig/utils/path_extended.py +44 -95
- machineconfig/utils/path_helper.py +76 -23
- machineconfig/utils/procs.py +1 -1
- machineconfig/utils/scheduler.py +20 -53
- machineconfig/utils/scheduling.py +0 -2
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
- machineconfig/utils/schemas/layouts/layout_types.py +1 -1
- machineconfig/utils/ssh.py +159 -412
- machineconfig/utils/ssh_utils/abc.py +5 -0
- machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
- machineconfig/utils/ssh_utils/copy_to_here.py +302 -0
- machineconfig/utils/ssh_utils/utils.py +142 -0
- machineconfig/utils/ssh_utils/wsl.py +210 -0
- machineconfig/utils/terminal.py +1 -0
- machineconfig/utils/upgrade_packages.py +104 -28
- machineconfig/utils/ve.py +12 -4
- machineconfig-7.98.dist-info/METADATA +132 -0
- {machineconfig-6.82.dist-info → machineconfig-7.98.dist-info}/RECORD +259 -196
- {machineconfig-6.82.dist-info → machineconfig-7.98.dist-info}/entry_points.txt +4 -1
- machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
- machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
- machineconfig/jobs/installer/powershell_scripts/archive_pygraphviz.ps1 +0 -12
- machineconfig/scripts/linux/fzf2g +0 -21
- machineconfig/scripts/linux/fzfag +0 -17
- machineconfig/scripts/linux/fzffg +0 -25
- machineconfig/scripts/linux/fzfrga +0 -21
- machineconfig/scripts/linux/mcfgs +0 -38
- machineconfig/scripts/linux/other/share_smb +0 -1
- machineconfig/scripts/linux/skrg +0 -4
- machineconfig/scripts/linux/warp-cli.sh +0 -122
- machineconfig/scripts/linux/z_ls +0 -104
- machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
- machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
- machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
- machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
- machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
- machineconfig/scripts/python/helpers_fire/template.sh +0 -15
- machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +0 -17
- machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
- machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
- machineconfig/scripts/windows/fzfb.ps1 +0 -3
- machineconfig/scripts/windows/fzfg.ps1 +0 -2
- machineconfig/scripts/windows/fzfrga.bat +0 -20
- machineconfig/scripts/windows/mcfgs.ps1 +0 -17
- machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
- machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
- machineconfig/settings/lf/windows/tst.ps1 +0 -1
- machineconfig/settings/yazi/yazi.toml +0 -4
- machineconfig/setup_linux/apps.sh +0 -66
- machineconfig/setup_linux/others/cli_installation.sh +0 -137
- machineconfig/setup_mac/apps.sh +0 -73
- machineconfig/setup_windows/apps.ps1 +0 -62
- machineconfig/utils/installer_utils/installer.py +0 -225
- machineconfig-6.82.dist-info/METADATA +0 -82
- /machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
- /machineconfig/scripts/python/{helpers_fire → ai/utils}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_fire/agentic_frameworks → helpers_agents}/__init__.py +0 -0
- /machineconfig/scripts/python/{nw → helpers_agents/agentic_frameworks}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_search.py +0 -0
- /machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_load_balancer.py +0 -0
- /machineconfig/scripts/python/{helpers_fire → helpers_agents/templates}/template.ps1 +0 -0
- /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers_fire_command/f.py} +0 -0
- /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_network/__init__.py} +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/devops_add_identity.py +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/mount_drive +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive.py +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/mount_smb +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/onetimeshare.py +0 -0
- /machineconfig/scripts/{Restore-ThunderbirdProfile.ps1 → windows/mounts/Restore-ThunderbirdProfile.ps1} +0 -0
- /machineconfig/{jobs/installer/powershell_scripts → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
- /machineconfig/{jobs/installer/powershell_scripts → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
- {machineconfig-6.82.dist-info → machineconfig-7.98.dist-info}/WHEEL +0 -0
- {machineconfig-6.82.dist-info → machineconfig-7.98.dist-info}/top_level.txt +0 -0
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
|
|
3
|
-
mkdir -p $HOME/Downloads || true
|
|
4
|
-
cd $HOME/Downloads
|
|
5
|
-
curl --proto '=https' --tlsv1.2 -sSf "https://desktop-release.q.us-east-1.amazonaws.com/latest/q-x86_64-linux.zip" -o "q.zip"
|
|
6
|
-
unzip q.zip
|
|
7
|
-
./q/install.sh # goes to ~/.local/bin.
|
|
8
|
-
rm q.zip
|
|
9
|
-
rm -rfd q
|
|
3
|
+
# mkdir -p $HOME/Downloads || true
|
|
4
|
+
# cd $HOME/Downloads
|
|
5
|
+
# curl --proto '=https' --tlsv1.2 -sSf "https://desktop-release.q.us-east-1.amazonaws.com/latest/q-x86_64-linux.zip" -o "q.zip"
|
|
6
|
+
# unzip q.zip
|
|
7
|
+
# ./q/install.sh # goes to ~/.local/bin.
|
|
8
|
+
# rm q.zip
|
|
9
|
+
# rm -rfd q
|
|
10
|
+
|
|
11
|
+
# This is a clean installation that inloves only binary movement, no bashrc manipulation.
|
|
12
|
+
devops install "https://desktop-release.q.us-east-1.amazonaws.com/latest/q-x86_64-linux.zip"
|
|
@@ -1,13 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
|
+
GUI = [
|
|
3
|
+
"brave",
|
|
4
|
+
"code",
|
|
5
|
+
"git",
|
|
6
|
+
# "wezterm", # needs admin
|
|
7
|
+
]
|
|
2
8
|
|
|
3
9
|
# AI/LLM Tools - AI-powered coding and chat assistants
|
|
4
10
|
AGENTS = [
|
|
5
11
|
"aider",
|
|
12
|
+
"aichat",
|
|
6
13
|
"copilot",
|
|
7
14
|
"gemini",
|
|
8
15
|
"crush",
|
|
9
16
|
"opencode-ai",
|
|
10
|
-
"ollama",
|
|
17
|
+
# "ollama",
|
|
11
18
|
"chatgpt",
|
|
12
19
|
"mods",
|
|
13
20
|
"q",
|
|
@@ -17,6 +24,7 @@ AGENTS = [
|
|
|
17
24
|
"kilocode",
|
|
18
25
|
"cline",
|
|
19
26
|
"auggie",
|
|
27
|
+
# "gorilla",
|
|
20
28
|
]
|
|
21
29
|
|
|
22
30
|
|
|
@@ -54,9 +62,14 @@ PACKAGES_CODE_EDITORS = [
|
|
|
54
62
|
# Database Tools - Database clients and visualizers
|
|
55
63
|
PACKAGES_DATABASE = [
|
|
56
64
|
"SqliteBrowser",
|
|
65
|
+
"sqlite3",
|
|
66
|
+
"redis",
|
|
67
|
+
"redis-cli",
|
|
68
|
+
"postgresql-client",
|
|
69
|
+
"duckdb",
|
|
57
70
|
"DBeaver",
|
|
58
71
|
"rainfrog",
|
|
59
|
-
|
|
72
|
+
|
|
60
73
|
]
|
|
61
74
|
|
|
62
75
|
|
|
@@ -136,22 +149,23 @@ PACKAGES_PRODUCTIVITY = [
|
|
|
136
149
|
"hx",
|
|
137
150
|
]
|
|
138
151
|
|
|
139
|
-
|
|
140
|
-
|
|
152
|
+
|
|
153
|
+
# sudo nala install cowsay -y || true
|
|
154
|
+
# sudo nala install lolcat -y || true
|
|
155
|
+
# sudo nala install boxes -y || true
|
|
156
|
+
# sudo nala install figlet -y || true
|
|
157
|
+
# sudo nala install fortune -y || true
|
|
158
|
+
# sudo nala install toilet -y || true
|
|
159
|
+
TERMINAL_EYE_CANDY = [
|
|
141
160
|
"lolcatjs",
|
|
142
161
|
"figlet-cli",
|
|
143
162
|
"boxes",
|
|
144
|
-
"
|
|
145
|
-
"
|
|
146
|
-
"
|
|
147
|
-
"
|
|
148
|
-
"
|
|
149
|
-
"
|
|
150
|
-
"xcrawl3r",
|
|
151
|
-
"obsidian",
|
|
152
|
-
"istio",
|
|
153
|
-
"cointop",
|
|
154
|
-
"nnn",
|
|
163
|
+
# "transmission",
|
|
164
|
+
# "bytehound",
|
|
165
|
+
# "xcrawl3r",
|
|
166
|
+
# "obsidian",
|
|
167
|
+
# "istio",
|
|
168
|
+
# "cointop",
|
|
155
169
|
]
|
|
156
170
|
|
|
157
171
|
|
|
@@ -179,6 +193,7 @@ PACKAGES_FILE = [
|
|
|
179
193
|
"winget",
|
|
180
194
|
"fd",
|
|
181
195
|
"fzf",
|
|
196
|
+
"tv",
|
|
182
197
|
"broot",
|
|
183
198
|
"rg",
|
|
184
199
|
"rga",
|
|
@@ -187,11 +202,13 @@ PACKAGES_FILE = [
|
|
|
187
202
|
"pistol",
|
|
188
203
|
"bat",
|
|
189
204
|
"viu",
|
|
190
|
-
"xplr",
|
|
191
|
-
"joshuto",
|
|
192
|
-
"lf",
|
|
193
|
-
"
|
|
205
|
+
# "xplr",
|
|
206
|
+
# "joshuto",
|
|
207
|
+
# "lf",
|
|
208
|
+
# "nnn",
|
|
194
209
|
"yazi",
|
|
210
|
+
"tere",
|
|
211
|
+
# "exa",
|
|
195
212
|
"lsd",
|
|
196
213
|
"zoxide",
|
|
197
214
|
"diskonaut",
|
|
@@ -206,82 +223,34 @@ PACKAGES_TERMINAL_SHELL = [
|
|
|
206
223
|
"zellij",
|
|
207
224
|
"mprocs",
|
|
208
225
|
"mcfly",
|
|
226
|
+
"atuin",
|
|
209
227
|
"starship",
|
|
210
228
|
"gotty",
|
|
211
229
|
"ttyd",
|
|
212
230
|
"rclone",
|
|
231
|
+
"cb"
|
|
213
232
|
]
|
|
214
233
|
|
|
215
234
|
|
|
216
235
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
"
|
|
221
|
-
"
|
|
222
|
-
"
|
|
223
|
-
"
|
|
224
|
-
"
|
|
225
|
-
"
|
|
226
|
-
"
|
|
227
|
-
"
|
|
228
|
-
"
|
|
229
|
-
"
|
|
230
|
-
"
|
|
231
|
-
"
|
|
232
|
-
"
|
|
233
|
-
"
|
|
234
|
-
"
|
|
235
|
-
"
|
|
236
|
-
"MISC_DEV",
|
|
237
|
-
"SYSTEM_MONITORS",
|
|
238
|
-
"FILE_TOOLS",
|
|
239
|
-
"FILE_VIEWERS",
|
|
240
|
-
"SEARCH",
|
|
241
|
-
"TERMINAL_SHELL",
|
|
242
|
-
"CLOUD_UTILS",
|
|
243
|
-
"WEB_TERMINAL",
|
|
244
|
-
]
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
# Main ESSENTIAL package list - combines all subgroups
|
|
249
|
-
ESSENTIAL = [
|
|
250
|
-
*PACKAGES_CODE_ANALYSIS,
|
|
251
|
-
*PACKAGES_SYSTEM_MONITORS,
|
|
252
|
-
*PACKAGES_TERMINAL_SHELL,
|
|
253
|
-
*PACKAGES_FILE,
|
|
254
|
-
]
|
|
255
|
-
DEV = [
|
|
256
|
-
*PACKAGES_TERMINAL_EMULATORS,
|
|
257
|
-
*PACKAGES_BROWSERS,
|
|
258
|
-
*PACKAGES_CODE_EDITORS,
|
|
259
|
-
*PACKAGES_DATABASE,
|
|
260
|
-
*PACKAGES_MEDIA,
|
|
261
|
-
*PACKAGES_FILE_SHARING,
|
|
262
|
-
*PACKAGES_DEV_UTILS,
|
|
263
|
-
*PACKAGES_CODE_ANALYSIS,
|
|
264
|
-
*PACKAGES_PRODUCTIVITY,
|
|
265
|
-
*PACKAGES_MISC_DEV,
|
|
266
|
-
]
|
|
267
|
-
|
|
268
|
-
PACKAGE_GROUP2NAMES: dict[PACKAGE_GROUPS, list[str]] = {
|
|
269
|
-
"ESSENTIAL": ESSENTIAL,
|
|
270
|
-
"DEV": DEV,
|
|
271
|
-
"AGENTS": AGENTS,
|
|
272
|
-
"TERMINAL_EMULATORS": PACKAGES_TERMINAL_EMULATORS,
|
|
273
|
-
"BROWSERS": PACKAGES_BROWSERS,
|
|
274
|
-
"CODE_EDITORS": PACKAGES_CODE_EDITORS,
|
|
275
|
-
"DATABASE": PACKAGES_DATABASE,
|
|
276
|
-
"MEDIA": PACKAGES_MEDIA,
|
|
277
|
-
"FILE_SHARING": PACKAGES_FILE_SHARING,
|
|
278
|
-
"DEV_UTILS": PACKAGES_DEV_UTILS,
|
|
279
|
-
"CODE_ANALYSIS": PACKAGES_CODE_ANALYSIS,
|
|
280
|
-
"PRODUCTIVITY": PACKAGES_PRODUCTIVITY,
|
|
281
|
-
"MISC_DEV": PACKAGES_MISC_DEV,
|
|
282
|
-
"SYSTEM_MONITORS": PACKAGES_SYSTEM_MONITORS,
|
|
283
|
-
"SEARCH": PACKAGES_FILE,
|
|
284
|
-
"TERMINAL_SHELL": PACKAGES_TERMINAL_SHELL,
|
|
236
|
+
PACKAGE_GROUP2NAMES: dict[str, list[str]] = {
|
|
237
|
+
"sysabc": ["sysabc"],
|
|
238
|
+
"termabc": [*PACKAGES_CODE_ANALYSIS, *PACKAGES_SYSTEM_MONITORS, *PACKAGES_TERMINAL_SHELL, *PACKAGES_FILE,],
|
|
239
|
+
"gui": GUI,
|
|
240
|
+
"dev": [*PACKAGES_TERMINAL_EMULATORS, *PACKAGES_BROWSERS, *PACKAGES_CODE_EDITORS, *PACKAGES_DATABASE, *PACKAGES_MEDIA, *PACKAGES_FILE_SHARING, *PACKAGES_DEV_UTILS, *PACKAGES_CODE_ANALYSIS, *PACKAGES_PRODUCTIVITY, *TERMINAL_EYE_CANDY,],
|
|
241
|
+
"dev-utils": PACKAGES_DEV_UTILS,
|
|
242
|
+
"term-eye-candy": TERMINAL_EYE_CANDY,
|
|
243
|
+
"agents": AGENTS,
|
|
244
|
+
"terminal-emulator": PACKAGES_TERMINAL_EMULATORS,
|
|
245
|
+
"shell": PACKAGES_TERMINAL_SHELL,
|
|
246
|
+
"browsers": PACKAGES_BROWSERS,
|
|
247
|
+
"code-editors": PACKAGES_CODE_EDITORS,
|
|
248
|
+
"code-analysis": PACKAGES_CODE_ANALYSIS,
|
|
249
|
+
"db": PACKAGES_DATABASE,
|
|
250
|
+
"media": PACKAGES_MEDIA,
|
|
251
|
+
"file-sharing": PACKAGES_FILE_SHARING,
|
|
252
|
+
"productivity": PACKAGES_PRODUCTIVITY,
|
|
253
|
+
"sys-monitor": PACKAGES_SYSTEM_MONITORS,
|
|
254
|
+
"search": PACKAGES_FILE,
|
|
285
255
|
}
|
|
286
256
|
|
|
287
|
-
_ = Union, Literal
|
|
@@ -6,6 +6,19 @@ $objShell = New-Object -ComObject Shell.Application
|
|
|
6
6
|
$objFolder = $objShell.Namespace($FONTS)
|
|
7
7
|
$Fontdir = Get-ChildItem -Path $Path -File
|
|
8
8
|
|
|
9
|
+
$invalidCharPattern = "[{0}]" -f ([Regex]::Escape(([string]::Join('', [System.IO.Path]::GetInvalidFileNameChars()))))
|
|
10
|
+
|
|
11
|
+
function Get-FontBaseNameSafe {
|
|
12
|
+
param([string]$Input)
|
|
13
|
+
if ([string]::IsNullOrWhiteSpace($Input)) { return "" }
|
|
14
|
+
$candidate = ($Input -split ',')[0].Trim()
|
|
15
|
+
try { return [System.IO.Path]::GetFileNameWithoutExtension($candidate) }
|
|
16
|
+
catch {
|
|
17
|
+
$sanitized = [Regex]::Replace($candidate, $invalidCharPattern, '')
|
|
18
|
+
return ($sanitized -replace '\\.[^.]+$')
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
9
22
|
# Normalization helper: remove spaces, underscores, hyphens, 'nerd', 'font', and collapse 'nf' for broad matching
|
|
10
23
|
function Normalize-FontName {
|
|
11
24
|
param([string]$Name)
|
|
@@ -17,47 +30,129 @@ function Normalize-FontName {
|
|
|
17
30
|
return $n
|
|
18
31
|
}
|
|
19
32
|
|
|
33
|
+
function Get-FontIdentityForms {
|
|
34
|
+
param([string]$Name)
|
|
35
|
+
if ([string]::IsNullOrWhiteSpace($Name)) { return @() }
|
|
36
|
+
$normalized = Normalize-FontName $Name
|
|
37
|
+
if ([string]::IsNullOrWhiteSpace($normalized)) { return @() }
|
|
38
|
+
|
|
39
|
+
$forms = @()
|
|
40
|
+
$forms += $normalized
|
|
41
|
+
|
|
42
|
+
$stylePattern = '(regular|italic|oblique|bold|bolditalic|semibold|semilight|light|extrabold|extralight|medium|thin|black|book|ultra|heavy|demi|retina|condensed|narrow|windowscompatible|complete|windowscomp|compatibility)+$'
|
|
43
|
+
$stem = $normalized
|
|
44
|
+
while ($stem -match $stylePattern) {
|
|
45
|
+
$stem = [Regex]::Replace($stem, $stylePattern, '')
|
|
46
|
+
if ([string]::IsNullOrWhiteSpace($stem)) { break }
|
|
47
|
+
$forms += $stem
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
$stemForVariants = $stem
|
|
51
|
+
foreach ($tail in @('mono', 'propo')) {
|
|
52
|
+
$tmp = $stemForVariants
|
|
53
|
+
while (-not [string]::IsNullOrWhiteSpace($tmp) -and $tmp.EndsWith($tail)) {
|
|
54
|
+
$tmp = $tmp.Substring(0, $tmp.Length - $tail.Length)
|
|
55
|
+
if ([string]::IsNullOrWhiteSpace($tmp)) { break }
|
|
56
|
+
$forms += $tmp
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return ($forms | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } | Select-Object -Unique)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function Test-FontFormsOverlapFuzzy {
|
|
64
|
+
param(
|
|
65
|
+
[string[]]$CandidateForms,
|
|
66
|
+
[string[]]$ExistingForms
|
|
67
|
+
)
|
|
68
|
+
foreach ($candidate in $CandidateForms) {
|
|
69
|
+
if ([string]::IsNullOrWhiteSpace($candidate)) { continue }
|
|
70
|
+
foreach ($existing in $ExistingForms) {
|
|
71
|
+
if ([string]::IsNullOrWhiteSpace($existing)) { continue }
|
|
72
|
+
if ($existing.Contains($candidate) -or $candidate.Contains($existing)) { return $true }
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return $false
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function Merge-UniqueForms {
|
|
79
|
+
param(
|
|
80
|
+
[string[]]$Existing,
|
|
81
|
+
[string[]]$Additional
|
|
82
|
+
)
|
|
83
|
+
return (($Existing + $Additional) | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } | Select-Object -Unique)
|
|
84
|
+
}
|
|
85
|
+
|
|
20
86
|
# Cache installed font basenames once (raw + normalized map)
|
|
21
87
|
$installedFontFiles = Get-ChildItem C:\Windows\Fonts -File
|
|
22
|
-
$installedFonts = @
|
|
23
|
-
foreach ($f in $installedFontFiles) {
|
|
88
|
+
$installedFonts = @()
|
|
89
|
+
foreach ($f in $installedFontFiles) {
|
|
90
|
+
$installedFonts = Merge-UniqueForms $installedFonts (Get-FontIdentityForms $f.BaseName)
|
|
91
|
+
}
|
|
24
92
|
|
|
25
|
-
|
|
93
|
+
$relatedInstalled = $installedFonts | Where-Object { $_ -match 'caskaydiacove|cascadiacode' } | Sort-Object | Get-Unique
|
|
94
|
+
Write-Host "Existing related fonts detected:" $relatedInstalled -ForegroundColor DarkGray
|
|
95
|
+
|
|
96
|
+
$registryFonts = @()
|
|
97
|
+
$fontReg = $null
|
|
98
|
+
try {
|
|
99
|
+
$fontReg = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts' -ErrorAction Stop
|
|
100
|
+
} catch {
|
|
101
|
+
Write-Host "Registry font list unavailable: $($_.Exception.Message)" -ForegroundColor DarkYellow
|
|
102
|
+
}
|
|
103
|
+
if ($null -ne $fontReg) {
|
|
104
|
+
foreach ($prop in $fontReg.PSObject.Properties) {
|
|
105
|
+
$val = ($prop.Value | Out-String).Trim()
|
|
106
|
+
$nm = ($prop.Name | Out-String).Trim()
|
|
107
|
+
$registryFonts = Merge-UniqueForms $registryFonts (Get-FontIdentityForms (Get-FontBaseNameSafe $val))
|
|
108
|
+
$registryFonts = Merge-UniqueForms $registryFonts (Get-FontIdentityForms (Get-FontBaseNameSafe $nm))
|
|
109
|
+
}
|
|
110
|
+
}
|
|
26
111
|
|
|
27
112
|
foreach ($File in $Fontdir) {
|
|
28
|
-
if ($File.Name -
|
|
29
|
-
$candidateRaw = $File.BaseName
|
|
30
|
-
$candidateNorm = Normalize-FontName $candidateRaw
|
|
31
|
-
|
|
32
|
-
# 1. Exact file existence check (handles .ttf/.otf pairs) before invoking Shell CopyHere.
|
|
33
|
-
$destFile = Join-Path -Path 'C:\Windows\Fonts' -ChildPath $File.Name
|
|
34
|
-
if (Test-Path -LiteralPath $destFile) { Write-Host "Skip (file exists) $($File.Name)" -ForegroundColor Green; continue }
|
|
35
|
-
|
|
36
|
-
# 2. Registry check: Fonts are registered under HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
|
|
37
|
-
try {
|
|
38
|
-
$fontReg = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts' -ErrorAction Stop
|
|
39
|
-
$regMatch = $false
|
|
40
|
-
foreach ($prop in $fontReg.PSObject.Properties) {
|
|
41
|
-
$val = ($prop.Value | Out-String).Trim()
|
|
42
|
-
$nm = ($prop.Name | Out-String).Trim()
|
|
43
|
-
$valNorm = Normalize-FontName ( [System.IO.Path]::GetFileNameWithoutExtension($val) )
|
|
44
|
-
$nmNorm = Normalize-FontName $nm
|
|
45
|
-
if ($valNorm -eq $candidateNorm -or $nmNorm -eq $candidateNorm -or $nmNorm -match [Regex]::Escape($candidateNorm)) { $regMatch = $true; break }
|
|
46
|
-
}
|
|
47
|
-
if ($regMatch) {
|
|
48
|
-
Write-Host "Skip (registry) $($File.Name)" -ForegroundColor Green
|
|
49
|
-
continue
|
|
50
|
-
}
|
|
51
|
-
} catch {
|
|
52
|
-
Write-Host "Registry font query failed: $($_.Exception.Message) (continuing)" -ForegroundColor DarkYellow
|
|
53
|
-
}
|
|
113
|
+
if ($File.Name -match 'pfb$') { continue }
|
|
54
114
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
115
|
+
$candidateForms = Get-FontIdentityForms $File.BaseName
|
|
116
|
+
if ($candidateForms.Count -eq 0) { $candidateForms = @(Normalize-FontName $File.BaseName) }
|
|
117
|
+
$candidateNorm = if ($candidateForms.Count -gt 0) { $candidateForms[0] } else { '' }
|
|
58
118
|
|
|
59
|
-
|
|
60
|
-
|
|
119
|
+
# 1. Exact file existence check (handles .ttf/.otf pairs) before invoking Shell CopyHere.
|
|
120
|
+
$destFile = Join-Path -Path 'C:\Windows\Fonts' -ChildPath $File.Name
|
|
121
|
+
if (Test-Path -LiteralPath $destFile) {
|
|
122
|
+
Write-Host "Skip (file exists) $($File.Name)" -ForegroundColor Green
|
|
123
|
+
$installedFonts = Merge-UniqueForms $installedFonts $candidateForms
|
|
124
|
+
continue
|
|
61
125
|
}
|
|
126
|
+
|
|
127
|
+
# 2. Registry check: Fonts are registered under HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
|
|
128
|
+
if ($registryFonts.Count -gt 0) {
|
|
129
|
+
$exactRegMatch = $candidateForms | Where-Object { $registryFonts -contains $_ }
|
|
130
|
+
if ($exactRegMatch.Count -gt 0) {
|
|
131
|
+
Write-Host "Skip (registry) $($File.Name)" -ForegroundColor Green
|
|
132
|
+
$installedFonts = Merge-UniqueForms $installedFonts $candidateForms
|
|
133
|
+
continue
|
|
134
|
+
}
|
|
135
|
+
if (Test-FontFormsOverlapFuzzy $candidateForms $registryFonts) {
|
|
136
|
+
Write-Host "Skip (registry family) $($File.Name)" -ForegroundColor Green
|
|
137
|
+
$installedFonts = Merge-UniqueForms $installedFonts $candidateForms
|
|
138
|
+
continue
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
# 3. Original heuristic set: in-memory list
|
|
143
|
+
if (($candidateForms | Where-Object { $installedFonts -contains $_ }).Count -gt 0) {
|
|
144
|
+
Write-Host "Skip (installed map) $($File.Name)" -ForegroundColor Green
|
|
145
|
+
$installedFonts = Merge-UniqueForms $installedFonts $candidateForms
|
|
146
|
+
continue
|
|
147
|
+
}
|
|
148
|
+
if (Test-FontFormsOverlapFuzzy $candidateForms $installedFonts) {
|
|
149
|
+
Write-Host "Skip (installed family) $($File.Name)" -ForegroundColor Green
|
|
150
|
+
$installedFonts = Merge-UniqueForms $installedFonts $candidateForms
|
|
151
|
+
continue
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
Write-Host "Installing font (no matches) $($File.Name) | norm=$candidateNorm" -ForegroundColor Yellow
|
|
155
|
+
$objFolder.CopyHere($File.FullName)
|
|
156
|
+
$installedFonts = Merge-UniqueForms $installedFonts $candidateForms
|
|
62
157
|
}
|
|
63
158
|
Write-Host "Font installation script completed." -ForegroundColor Cyan
|
machineconfig/logger.py
CHANGED
|
@@ -1,35 +1,62 @@
|
|
|
1
1
|
|
|
2
2
|
from typing import Literal
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
import shutil
|
|
3
5
|
from machineconfig.utils.source_of_truth import LIBRARY_ROOT, CONFIG_ROOT
|
|
4
6
|
|
|
5
7
|
|
|
6
|
-
def
|
|
7
|
-
|
|
8
|
+
def _copy_path(source: Path, target: Path, overwrite: bool = False) -> None:
|
|
9
|
+
source = source.expanduser().resolve()
|
|
10
|
+
target = target.expanduser().resolve()
|
|
11
|
+
if not source.exists():
|
|
12
|
+
raise FileNotFoundError(f"Source path does not exist: {source}")
|
|
13
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
14
|
+
if target.exists() and not overwrite:
|
|
15
|
+
raise FileExistsError(f"Target already exists and overwrite=False: {target}")
|
|
16
|
+
if target.exists() and overwrite:
|
|
17
|
+
if target.is_dir():
|
|
18
|
+
shutil.rmtree(target)
|
|
19
|
+
else:
|
|
20
|
+
target.unlink()
|
|
21
|
+
if source.is_file():
|
|
22
|
+
shutil.copy2(source, target)
|
|
23
|
+
elif source.is_dir():
|
|
24
|
+
shutil.copytree(source, target, dirs_exist_ok=overwrite)
|
|
25
|
+
else:
|
|
26
|
+
raise ValueError(f"Source is neither file nor directory: {source}")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def copy_assets_to_machine(which: Literal["scripts", "settings"]) -> None:
|
|
8
30
|
import platform
|
|
9
|
-
|
|
31
|
+
import subprocess
|
|
32
|
+
|
|
33
|
+
system_name = platform.system().lower()
|
|
34
|
+
if system_name == "windows":
|
|
10
35
|
system = "windows"
|
|
11
|
-
elif
|
|
36
|
+
elif system_name in {"linux", "darwin"}:
|
|
12
37
|
system = "linux"
|
|
13
38
|
else:
|
|
14
|
-
raise NotImplementedError(f"System {
|
|
39
|
+
raise NotImplementedError(f"System {system_name} not supported")
|
|
40
|
+
|
|
15
41
|
match which:
|
|
16
42
|
case "scripts":
|
|
17
43
|
source = LIBRARY_ROOT.joinpath("scripts", system)
|
|
18
|
-
target = CONFIG_ROOT.joinpath("scripts"
|
|
19
|
-
|
|
44
|
+
target = CONFIG_ROOT.joinpath("scripts")
|
|
45
|
+
|
|
46
|
+
wrap_mcfg_source = LIBRARY_ROOT.joinpath("scripts", "nu", "wrap_mcfg.nu")
|
|
47
|
+
wrap_mcfg_target = CONFIG_ROOT.joinpath("scripts", "wrap_mcfg.nu")
|
|
48
|
+
wrap_mcfg_target.parent.mkdir(parents=True, exist_ok=True)
|
|
49
|
+
_copy_path(source=wrap_mcfg_source, target=wrap_mcfg_target, overwrite=True)
|
|
20
50
|
case "settings":
|
|
21
51
|
source = LIBRARY_ROOT.joinpath("settings")
|
|
22
52
|
target = CONFIG_ROOT.joinpath("settings")
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if system == "linux" and which == "scripts":
|
|
28
|
-
import subprocess
|
|
53
|
+
|
|
54
|
+
_copy_path(source=source, target=target, overwrite=True)
|
|
55
|
+
|
|
56
|
+
if system_name == "linux" and which == "scripts":
|
|
29
57
|
from rich.console import Console
|
|
30
58
|
console = Console()
|
|
31
59
|
console.print("\n[bold]📜 Setting executable permissions for scripts...[/bold]")
|
|
32
|
-
|
|
60
|
+
scripts_path = CONFIG_ROOT.joinpath("scripts")
|
|
61
|
+
subprocess.run(f"chmod +x {scripts_path} -R", shell=True, capture_output=True, text=True, check=False)
|
|
33
62
|
console.print("[green]✅ Script permissions updated[/green]")
|
|
34
|
-
|
|
35
|
-
|
|
@@ -13,6 +13,7 @@ from rich.table import Table
|
|
|
13
13
|
|
|
14
14
|
from machineconfig.utils.path_extended import PathExtended
|
|
15
15
|
from machineconfig.utils.links import symlink_map, copy_map
|
|
16
|
+
from machineconfig.profile.create_links_export import ON_CONFLICT_STRICT
|
|
16
17
|
from machineconfig.utils.source_of_truth import LIBRARY_ROOT, CONFIG_ROOT
|
|
17
18
|
|
|
18
19
|
import platform
|
|
@@ -79,7 +80,7 @@ def read_mapper() -> MapperFileData:
|
|
|
79
80
|
|
|
80
81
|
|
|
81
82
|
def apply_mapper(mapper_data: dict[str, list[ConfigMapper]],
|
|
82
|
-
on_conflict:
|
|
83
|
+
on_conflict: ON_CONFLICT_STRICT,
|
|
83
84
|
method: Literal["symlink", "copy"]
|
|
84
85
|
):
|
|
85
86
|
operation_records: list[OperationRecord] = []
|
|
@@ -1,12 +1,33 @@
|
|
|
1
1
|
|
|
2
2
|
import typer
|
|
3
|
-
from typing import Optional, Literal, Annotated
|
|
3
|
+
from typing import Optional, Literal, Annotated, TypeAlias
|
|
4
4
|
|
|
5
|
+
ON_CONFLICT_LOOSE: TypeAlias = Literal[
|
|
6
|
+
"throw-error", "t",
|
|
7
|
+
"overwrite-self-managed", "os",
|
|
8
|
+
"backup-self-managed", "bs",
|
|
9
|
+
"overwrite-default-path", "od",
|
|
10
|
+
"backup-default-path", "bd"
|
|
11
|
+
]
|
|
12
|
+
ON_CONFLICT_STRICT: TypeAlias = Literal["throw-error", "overwrite-self-managed", "backup-self-managed", "overwrite-default-path", "backup-default-path"]
|
|
13
|
+
ON_CONFLICT_MAPPER: dict[str, ON_CONFLICT_STRICT] = {
|
|
14
|
+
"t": "throw-error",
|
|
15
|
+
"os": "overwrite-self-managed",
|
|
16
|
+
"bs": "backup-self-managed",
|
|
17
|
+
"od": "overwrite-default-path",
|
|
18
|
+
"bd": "backup-default-path",
|
|
19
|
+
"throw-error": "throw-error",
|
|
20
|
+
"overwrite-self-managed": "overwrite-self-managed",
|
|
21
|
+
"backup-self-managed": "backup-self-managed",
|
|
22
|
+
"overwrite-default-path": "overwrite-default-path",
|
|
23
|
+
"backup-default-path": "backup-default-path",
|
|
24
|
+
}
|
|
5
25
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
26
|
+
|
|
27
|
+
def main_public_from_parser(method: Annotated[Literal["symlink", "s", "copy", "c"], typer.Option(..., "--method", "-m", help="Method to use for setting up the config file.")],
|
|
28
|
+
on_conflict: Annotated[ON_CONFLICT_LOOSE, typer.Option(..., "--on-conflict", "-o", help="Action to take on conflict")] = "throw-error",
|
|
29
|
+
which: Annotated[Optional[str], typer.Option(..., "--which", "-w", help="Specific items to process")] = "all",
|
|
30
|
+
interactive: Annotated[bool, typer.Option(..., "--interactive", "-i", help="Run in interactive mode")] = False):
|
|
10
31
|
"""Terminology:
|
|
11
32
|
SOURCE = Self-Managed-Config-File-Path
|
|
12
33
|
TARGET = Config-File-Default-Path
|
|
@@ -16,7 +37,7 @@ def main_public_from_parser(method: Annotated[Literal["symlink", "copy"], typer.
|
|
|
16
37
|
if which is None:
|
|
17
38
|
assert interactive is True
|
|
18
39
|
from machineconfig.utils.options import choose_from_options
|
|
19
|
-
items_chosen = choose_from_options(msg="Which symlink to create?", options=list(mapper_full.keys()),
|
|
40
|
+
items_chosen = choose_from_options(msg="Which symlink to create?", options=list(mapper_full.keys()), tv=True, multi=True)
|
|
20
41
|
else:
|
|
21
42
|
assert interactive is False
|
|
22
43
|
if which == "all":
|
|
@@ -24,31 +45,56 @@ def main_public_from_parser(method: Annotated[Literal["symlink", "copy"], typer.
|
|
|
24
45
|
else:
|
|
25
46
|
items_chosen = which.split(",")
|
|
26
47
|
items_objections: dict[str, list[ConfigMapper]] = {item: mapper_full[item] for item in items_chosen if item in mapper_full}
|
|
27
|
-
|
|
48
|
+
if len(items_objections) == 0:
|
|
49
|
+
typer.echo("[red]Error:[/] No valid items selected.")
|
|
50
|
+
typer.Exit(code=1)
|
|
51
|
+
return
|
|
28
52
|
from machineconfig.profile.create_links import apply_mapper
|
|
29
53
|
from machineconfig.profile.create_helper import copy_assets_to_machine
|
|
30
54
|
copy_assets_to_machine(which="settings") # config files live here and will be linked to.
|
|
31
|
-
|
|
55
|
+
method_map: dict[str, Literal["symlink", "copy"]] = {
|
|
56
|
+
"s": "symlink",
|
|
57
|
+
"symlink": "symlink",
|
|
58
|
+
"c": "copy",
|
|
59
|
+
"copy": "copy",
|
|
60
|
+
}
|
|
61
|
+
method = method_map[method]
|
|
62
|
+
apply_mapper(mapper_data=items_objections, on_conflict=ON_CONFLICT_MAPPER[on_conflict], method=method)
|
|
32
63
|
|
|
33
64
|
|
|
34
|
-
def main_private_from_parser(method: Annotated[Literal["symlink", "copy"], typer.Option(..., help="Method to use for linking files")],
|
|
35
|
-
on_conflict: Annotated[
|
|
36
|
-
which: Annotated[Optional[str], typer.Option(..., help="Specific items to process")] =
|
|
37
|
-
interactive: Annotated[bool, typer.Option(..., help="Run in interactive mode")] = False):
|
|
65
|
+
def main_private_from_parser(method: Annotated[Literal["symlink", "s", "copy", "c"], typer.Option(..., "--method", "-m", help="Method to use for linking files")],
|
|
66
|
+
on_conflict: Annotated[ON_CONFLICT_LOOSE, typer.Option(..., "--on-conflict", "-o", help="Action to take on conflict")] = "throw-error",
|
|
67
|
+
which: Annotated[Optional[str], typer.Option(..., "--which", "-w", help="Specific items to process")] = "all",
|
|
68
|
+
interactive: Annotated[bool, typer.Option(..., "--interactive", "-i", help="Run in interactive mode")] = False):
|
|
38
69
|
from machineconfig.profile.create_links import ConfigMapper, read_mapper
|
|
39
|
-
|
|
40
70
|
mapper_full = read_mapper()["private"]
|
|
41
71
|
if which is None:
|
|
42
|
-
|
|
72
|
+
if interactive is False:
|
|
73
|
+
typer.echo("[red]Error:[/] --which must be provided when not running in interactive mode.")
|
|
74
|
+
typer.Exit(code=1)
|
|
75
|
+
return
|
|
43
76
|
from machineconfig.utils.options import choose_from_options
|
|
44
|
-
items_chosen = choose_from_options(msg="Which symlink to create?", options=list(mapper_full.keys()),
|
|
77
|
+
items_chosen = choose_from_options(msg="Which symlink to create?", options=list(mapper_full.keys()), tv=True, multi=True)
|
|
45
78
|
else:
|
|
46
|
-
|
|
79
|
+
if interactive is True:
|
|
80
|
+
typer.echo("[yellow]Warning:[/] --which is provided, but its not allowed to be used together with --interactive. Ignoring --interactive flag.")
|
|
81
|
+
typer.Exit(code=0)
|
|
82
|
+
return
|
|
47
83
|
if which == "all":
|
|
48
84
|
items_chosen = list(mapper_full.keys())
|
|
49
85
|
else:
|
|
50
86
|
items_chosen = which.split(",")
|
|
51
87
|
items_objections: dict[str, list[ConfigMapper]] = {item: mapper_full[item] for item in items_chosen if item in mapper_full}
|
|
52
|
-
|
|
88
|
+
if len(items_objections) == 0:
|
|
89
|
+
typer.echo("[red]Error:[/] No valid items selected.")
|
|
90
|
+
typer.Exit(code=1)
|
|
91
|
+
return
|
|
53
92
|
from machineconfig.profile.create_links import apply_mapper
|
|
54
|
-
|
|
93
|
+
method_map: dict[str, Literal["symlink", "copy"]] = {
|
|
94
|
+
"s": "symlink",
|
|
95
|
+
"symlink": "symlink",
|
|
96
|
+
"c": "copy",
|
|
97
|
+
"copy": "copy",
|
|
98
|
+
}
|
|
99
|
+
method = method_map[method]
|
|
100
|
+
apply_mapper(mapper_data=items_objections, on_conflict=ON_CONFLICT_MAPPER[on_conflict], method=method)
|