machineconfig 7.98__py3-none-any.whl → 8.61__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/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 +271 -152
- machineconfig/jobs/installer/linux_scripts/docker.sh +6 -9
- machineconfig/jobs/installer/package_groups.py +11 -9
- machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +1 -2
- machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +1 -1
- machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +10 -8
- machineconfig/jobs/installer/{custom → python_scripts}/hx.py +30 -13
- machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +1 -1
- machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +6 -5
- machineconfig/jobs/installer/{custom_dev → python_scripts}/sysabc.py +28 -43
- machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +1 -1
- machineconfig/jobs/installer/{custom → python_scripts}/yazi.py +39 -19
- machineconfig/jobs/scripts/powershell_scripts/cmatrix.ps1 +52 -0
- machineconfig/jobs/scripts_dynamic/a.py +428 -0
- machineconfig/logger.py +1 -1
- machineconfig/profile/create_helper.py +21 -10
- machineconfig/profile/create_links.py +77 -20
- machineconfig/profile/create_links_export.py +63 -58
- machineconfig/profile/create_shell_profile.py +14 -0
- machineconfig/profile/mapper_data.toml +45 -0
- machineconfig/profile/mapper_dotfiles.toml +249 -0
- machineconfig/scripts/python/agents.py +76 -171
- 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 +8 -6
- 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 -155
- machineconfig/scripts/python/devops.py +57 -38
- machineconfig/scripts/python/devops_navigator.py +17 -3
- machineconfig/scripts/python/fire_jobs.py +10 -193
- machineconfig/scripts/python/ftpx.py +5 -224
- 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 +10 -7
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/copilot/config.yml +1 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/crush/crush.json +10 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/gemini/settings.json +12 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/privacy.py +109 -0
- machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.sh +3 -1
- 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 +4 -4
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers2.py +1 -1
- machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +229 -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 +262 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +130 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_config_mount.py +77 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +71 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_nw.py +285 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +274 -0
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_self.py +84 -33
- 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/helpers_devops/cli_share_temp.py +69 -0
- 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} +64 -50
- machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/commands.py +25 -0
- machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/device_entry.py +17 -0
- machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/devices.py +17 -0
- machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/linux.py +103 -0
- machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/macos.py +100 -0
- machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/selection.py +47 -0
- machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/utils.py +28 -0
- machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/windows.py +91 -0
- machineconfig/scripts/python/helpers/helpers_devops/run_script.py +197 -0
- 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_fire_command → helpers/helpers_fire_command}/file_wrangler.py +1 -0
- machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_args_helper.py +1 -0
- 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_fire_command/fire_jobs_streamlit_helper.py +0 -0
- 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 +2 -7
- 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 +52 -10
- machineconfig/scripts/python/helpers/helpers_network/address_switch.py +78 -0
- machineconfig/scripts/python/helpers/helpers_network/ftpx_impl.py +276 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/__init__.py +0 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_identity.py +73 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_key_windows.py +23 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_ssh_key.py +169 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_cloud_init.py +33 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_linux.py +338 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_linux_utils.py +35 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_windows.py +245 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_windows_utils.py +34 -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 +120 -37
- 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/attach_impl.py +87 -0
- machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +114 -0
- machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +1 -2
- machineconfig/scripts/python/helpers/helpers_sessions/utils.py +69 -0
- machineconfig/scripts/python/{helpers_utils → helpers/helpers_utils}/download.py +1 -1
- machineconfig/scripts/python/{helpers_devops/cli_utils.py → helpers/helpers_utils/pdf.py} +2 -2
- machineconfig/scripts/python/{helpers_utils/path.py → helpers/helpers_utils/python.py} +65 -40
- machineconfig/scripts/python/helpers/helpers_utils/specs.py +246 -0
- machineconfig/scripts/python/mcfg_entry.py +126 -48
- machineconfig/scripts/python/msearch.py +16 -61
- machineconfig/scripts/python/sessions.py +137 -191
- machineconfig/scripts/python/utils.py +104 -24
- machineconfig/settings/atuin/config.toml +294 -0
- machineconfig/settings/atuin/themes/catppuccin-mocha-mauve.toml +12 -0
- machineconfig/settings/linters/.ruff.toml +2 -1
- machineconfig/settings/mprocs/windows/mprocs.yaml +2 -2
- machineconfig/settings/shells/bash/init.sh +6 -10
- machineconfig/settings/shells/nushell/config.nu +23 -1
- machineconfig/settings/shells/nushell/env.nu +22 -48
- machineconfig/settings/shells/nushell/init.nu +64 -240
- machineconfig/settings/shells/pwsh/init.ps1 +71 -5
- machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
- machineconfig/settings/shells/wezterm/wezterm.lua +4 -0
- machineconfig/settings/shells/wt/settings.json +31 -37
- machineconfig/settings/shells/zsh/init.sh +25 -5
- 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/wt/__init__.py +0 -0
- machineconfig/settings/yazi/yazi_linux.toml +18 -8
- machineconfig/settings/zellij/__init__.py +0 -0
- machineconfig/settings/zellij/config.kdl +0 -295
- machineconfig/settings/zellij/layouts/__init__.py +0 -0
- machineconfig/settings/zellij/layouts/st.kdl +39 -9
- machineconfig/settings/zellij/layouts/st2.kdl +6 -2
- machineconfig/setup_linux/__init__.py +0 -1
- machineconfig/setup_linux/apps_desktop.sh +8 -27
- 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 +2 -5
- 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 +78 -33
- 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 +11 -91
- machineconfig/utils/installer_utils/github_release_scraper.py +99 -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 +7 -17
- machineconfig/utils/installer_utils/installer_helper.py +52 -36
- machineconfig/utils/installer_utils/installer_locator_utils.py +15 -25
- machineconfig/utils/installer_utils/installer_runner.py +4 -4
- machineconfig/utils/io.py +25 -8
- 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 +8 -7
- machineconfig/utils/procs.py +35 -27
- machineconfig/utils/scheduler.py +8 -2
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
- machineconfig/utils/schemas/layouts/layout_types.py +10 -0
- machineconfig/utils/source_of_truth.py +7 -1
- machineconfig/utils/ssh.py +73 -23
- machineconfig/utils/ssh_utils/abc.py +1 -1
- machineconfig/utils/ssh_utils/copy_from_here.py +19 -14
- machineconfig/utils/ssh_utils/copy_to_here.py +2 -1
- machineconfig/utils/ssh_utils/utils.py +23 -7
- 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-7.98.dist-info → machineconfig-8.61.dist-info}/METADATA +30 -23
- machineconfig-8.61.dist-info/RECORD +539 -0
- {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/entry_points.txt +0 -1
- machineconfig/jobs/installer/check_installations.py +0 -248
- machineconfig/profile/backup.toml +0 -49
- machineconfig/profile/mapper.toml +0 -263
- machineconfig/scripts/linux/other/share_cloud.sh +0 -64
- machineconfig/scripts/linux/other/share_nfs +0 -49
- machineconfig/scripts/linux/other/start_docker +0 -23
- machineconfig/scripts/linux/other/switch_ip +0 -20
- machineconfig/scripts/python/helpers/run_py_script.py +0 -79
- machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +0 -26
- 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_nw.py +0 -214
- machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -215
- 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/devops_add_identity.py +0 -82
- machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +0 -153
- machineconfig/scripts/python/helpers_network/mount_drive +0 -128
- machineconfig/scripts/python/helpers_network/mount_nfs +0 -49
- machineconfig/scripts/python/helpers_network/mount_nfs.py +0 -85
- machineconfig/scripts/python/helpers_network/mount_nw_drive +0 -61
- machineconfig/scripts/python/helpers_network/mount_nw_drive.py +0 -48
- machineconfig/scripts/python/helpers_network/mount_smb +0 -3
- machineconfig/scripts/python/helpers_network/mount_ssh.py +0 -64
- 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_network/wsl_windows_transfer.py +0 -67
- machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -77
- machineconfig/scripts/python/terminal.py +0 -133
- machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +0 -92
- machineconfig/scripts/windows/mounts/mount_nfs.ps1 +0 -42
- machineconfig/scripts/windows/mounts/mount_nw.ps1 +0 -9
- machineconfig/scripts/windows/mounts/mount_smb.ps1 +0 -2
- machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
- machineconfig/scripts/windows/mounts/share_cloud.cmd +0 -34
- machineconfig/scripts/windows/mounts/share_smb.ps1 +0 -16
- machineconfig/settings/zellij/config.orig.kdl +0 -295
- machineconfig/setup_linux/others/android.sh +0 -2
- machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -30
- machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
- machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
- machineconfig/setup_mac/ssh/openssh_setup.sh +0 -114
- machineconfig/setup_windows/others/docker.ps1 +0 -7
- machineconfig/setup_windows/others/obs.ps1 +0 -4
- machineconfig/setup_windows/others/power_options.ps1 +0 -7
- machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -29
- machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
- machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -37
- machineconfig/setup_windows/ssh/openssh-server_add_key.ps1 +0 -7
- machineconfig/setup_windows/ssh/openssh-server_copy-ssh-id.ps1 +0 -14
- machineconfig/utils/options_tv.py +0 -119
- machineconfig/utils/tst.py +0 -20
- machineconfig-7.98.dist-info/RECORD +0 -504
- /machineconfig/{jobs/installer/custom_dev → cluster/sessions_managers/wt_utils/examples}/__init__.py +0 -0
- /machineconfig/{scripts/python/helpers_agents → jobs/installer/checks}/__init__.py +0 -0
- /machineconfig/{scripts/python/helpers_agents/agentic_frameworks → jobs/installer/python_scripts}/__init__.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/cloudflare_warp_cli.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
- /machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +0 -0
- /machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
- /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
- /machineconfig/scripts/python/ai/{solutions/_shared.py → utils/shared.py} +0 -0
- /machineconfig/scripts/python/{helpers_cloud → graph}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → 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_devops → helpers/helpers_agents}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_devops/themes → 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}/templates/prompt.txt +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.ps1 +0 -0
- /machineconfig/scripts/python/{helpers_fire_command → 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_network → 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_sessions → helpers/helpers_devops}/__init__.py +0 -0
- /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers/helpers_devops/mount_helpers}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → 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_fire_command/f.py → 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/fire_jobs_streamlit_helper.py → helpers/helpers_fire_command/f.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}/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/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
- {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/WHEEL +0 -0
- {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
|
|
2
|
+
#!/usr/bin/env python3
|
|
3
|
+
import base64
|
|
4
|
+
import pathlib
|
|
5
|
+
import pprint
|
|
6
|
+
import shutil
|
|
7
|
+
import subprocess
|
|
8
|
+
import tempfile
|
|
9
|
+
import os
|
|
10
|
+
from typing import Any, overload, Literal, Union
|
|
11
|
+
|
|
12
|
+
from git import Optional
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _format_preview_value(value: Any) -> str:
|
|
16
|
+
if isinstance(value, str):
|
|
17
|
+
return value
|
|
18
|
+
return pprint.pformat(value, width=88, sort_dicts=True)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _toml_inline_table(values: dict[str, str]) -> str:
|
|
22
|
+
if not values:
|
|
23
|
+
return ""
|
|
24
|
+
parts: list[str] = []
|
|
25
|
+
for key in sorted(values.keys()):
|
|
26
|
+
raw_value = values[key]
|
|
27
|
+
escaped = raw_value.replace("\\", "\\\\").replace('"', '\\"')
|
|
28
|
+
parts.append(f'{key} = "{escaped}"')
|
|
29
|
+
return "env = { " + ", ".join(parts) + " }\n"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _normalize_extension(extension: str | None) -> str | None:
|
|
33
|
+
if extension is None:
|
|
34
|
+
return None
|
|
35
|
+
trimmed = extension.strip()
|
|
36
|
+
if trimmed.startswith("."):
|
|
37
|
+
trimmed = trimmed[1:]
|
|
38
|
+
if not trimmed:
|
|
39
|
+
return None
|
|
40
|
+
return trimmed
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _infer_extension_from_key(key: Optional[str]) -> str | None:
|
|
44
|
+
if not isinstance(key, str):
|
|
45
|
+
return None
|
|
46
|
+
candidate = key.strip()
|
|
47
|
+
if not candidate or any(char.isspace() for char in candidate):
|
|
48
|
+
return None
|
|
49
|
+
suffix = pathlib.Path(candidate).suffix
|
|
50
|
+
if not suffix:
|
|
51
|
+
return None
|
|
52
|
+
return _normalize_extension(suffix)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@overload
|
|
56
|
+
def select_from_options(options_to_preview_mapping: dict[str, Any], extension: str | None, multi: Literal[True], preview_size_percent: float) -> list[str]: ...
|
|
57
|
+
@overload
|
|
58
|
+
def select_from_options(options_to_preview_mapping: dict[str, Any], extension: str | None, multi: Literal[False], preview_size_percent: float) -> Union[str, None]: ...
|
|
59
|
+
def select_from_options(options_to_preview_mapping: dict[str, Any], extension: str | None, multi: bool, preview_size_percent: float) -> Union[Union[str, None], list[str]]:
|
|
60
|
+
keys = list(options_to_preview_mapping.keys())
|
|
61
|
+
if not keys:
|
|
62
|
+
return [] if multi else None
|
|
63
|
+
normalized_extension = _normalize_extension(extension)
|
|
64
|
+
preview_panel_size = max(10, min(90, int(preview_size_percent)))
|
|
65
|
+
terminal_width = shutil.get_terminal_size(fallback=(120, 40)).columns
|
|
66
|
+
preview_width = max(20, int(terminal_width * preview_panel_size / 100) - 4)
|
|
67
|
+
with tempfile.TemporaryDirectory(prefix="tv_channel_") as tmpdir:
|
|
68
|
+
tempdir = pathlib.Path(tmpdir)
|
|
69
|
+
entries: list[str] = []
|
|
70
|
+
index_map: dict[int, str] = {}
|
|
71
|
+
preview_map_path = tempdir / "previews.tsv"
|
|
72
|
+
preview_rows: list[str] = []
|
|
73
|
+
for idx, key in enumerate(keys):
|
|
74
|
+
display_key = key.replace("\t", " ").replace("\n", " ")
|
|
75
|
+
entries.append(f"{idx}\t{display_key}")
|
|
76
|
+
index_map[idx] = key
|
|
77
|
+
preview_value = _format_preview_value(options_to_preview_mapping[key])
|
|
78
|
+
encoded_preview = base64.b64encode(preview_value.encode("utf-8")).decode("ascii")
|
|
79
|
+
entry_extension = normalized_extension or _infer_extension_from_key(key) or ""
|
|
80
|
+
preview_rows.append(f"{idx}\t{encoded_preview}\t{entry_extension}")
|
|
81
|
+
preview_map_path.write_text("\n".join(preview_rows), encoding="utf-8")
|
|
82
|
+
entries_path = tempdir / "entries.tsv"
|
|
83
|
+
entries_path.write_text("\n".join(entries), encoding="utf-8")
|
|
84
|
+
preview_script = tempdir / "preview.sh"
|
|
85
|
+
preview_script.write_text(
|
|
86
|
+
"""#!/usr/bin/env bash
|
|
87
|
+
set -euo pipefail
|
|
88
|
+
|
|
89
|
+
idx="$1"
|
|
90
|
+
script_dir="$(cd -- "$(dirname -- "$0")" && pwd)"
|
|
91
|
+
previews_file="${script_dir}/previews.tsv"
|
|
92
|
+
|
|
93
|
+
if [[ ! -f "${previews_file}" ]]; then
|
|
94
|
+
exit 0
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
encoded_preview="$(awk -F '\t' -v idx="${idx}" '($1==idx){print $2; exit}' "${previews_file}" || true)"
|
|
98
|
+
|
|
99
|
+
if [[ -z "${encoded_preview}" ]]; then
|
|
100
|
+
exit 0
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
preview_content="$(printf '%s' "${encoded_preview}" | base64 --decode)"
|
|
104
|
+
|
|
105
|
+
preview_ext_from_row="$(awk -F '\t' -v idx="${idx}" '($1==idx){print $3; exit}' "${previews_file}" || true)"
|
|
106
|
+
preview_ext="${MCFG_PREVIEW_EXT:-${preview_ext_from_row}}"
|
|
107
|
+
preview_width="${MCFG_PREVIEW_WIDTH:-}"
|
|
108
|
+
preview_size_pct="${MCFG_PREVIEW_SIZE_PCT:-}"
|
|
109
|
+
|
|
110
|
+
if [[ -z "${preview_width}" && -n "${COLUMNS:-}" ]]; then
|
|
111
|
+
if [[ "${preview_size_pct}" =~ ^[0-9]+$ ]]; then
|
|
112
|
+
preview_width=$((COLUMNS * preview_size_pct / 100))
|
|
113
|
+
else
|
|
114
|
+
preview_width="${COLUMNS}"
|
|
115
|
+
fi
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
if command -v bat >/dev/null 2>&1; then
|
|
119
|
+
bat_args=(--force-colorization --style=plain --paging=never --wrap=character)
|
|
120
|
+
if [[ -n "${preview_ext}" ]]; then
|
|
121
|
+
bat_args+=(--language "${preview_ext}")
|
|
122
|
+
fi
|
|
123
|
+
if [[ "${preview_width}" =~ ^[0-9]+$ ]]; then
|
|
124
|
+
bat_args+=(--terminal-width "${preview_width}")
|
|
125
|
+
fi
|
|
126
|
+
printf '%s' "${preview_content}" | bat "${bat_args[@]}"
|
|
127
|
+
elif command -v glow >/dev/null 2>&1; then
|
|
128
|
+
printf '%s' "${preview_content}" | glow -
|
|
129
|
+
elif command -v fold >/dev/null 2>&1 && [[ "${preview_width}" =~ ^[0-9]+$ ]]; then
|
|
130
|
+
printf '%s' "${preview_content}" | fold -s -w "${preview_width}"
|
|
131
|
+
else
|
|
132
|
+
printf '%s' "${preview_content}"
|
|
133
|
+
fi
|
|
134
|
+
""",
|
|
135
|
+
encoding="utf-8"
|
|
136
|
+
)
|
|
137
|
+
preview_script.chmod(0o755)
|
|
138
|
+
preview_env: dict[str, str] = {
|
|
139
|
+
"BAT_THEME": "ansi",
|
|
140
|
+
"MCFG_PREVIEW_SIZE_PCT": str(preview_panel_size),
|
|
141
|
+
}
|
|
142
|
+
if normalized_extension is not None:
|
|
143
|
+
preview_env["MCFG_PREVIEW_EXT"] = normalized_extension
|
|
144
|
+
if preview_width > 0:
|
|
145
|
+
preview_env["MCFG_PREVIEW_WIDTH"] = str(preview_width)
|
|
146
|
+
preview_env_line = _toml_inline_table(preview_env)
|
|
147
|
+
channel_config = f"""[metadata]
|
|
148
|
+
name = "temp_options"
|
|
149
|
+
description = "Temporary channel for selecting options"
|
|
150
|
+
|
|
151
|
+
[source]
|
|
152
|
+
command = "bat '{entries_path}'"
|
|
153
|
+
display = "{{split:\\t:1}}"
|
|
154
|
+
output = "{{split:\\t:0}}"
|
|
155
|
+
|
|
156
|
+
[preview]
|
|
157
|
+
command = "{preview_script} {{split:\\t:0}}"
|
|
158
|
+
{preview_env_line}
|
|
159
|
+
|
|
160
|
+
[ui.preview_panel]
|
|
161
|
+
size = {preview_panel_size}
|
|
162
|
+
"""
|
|
163
|
+
channel_path = tempdir / "temp_options.toml"
|
|
164
|
+
channel_path.write_text(channel_config, encoding="utf-8")
|
|
165
|
+
env = os.environ.copy()
|
|
166
|
+
tv_config_dir = pathlib.Path.home() / ".config" / "television"
|
|
167
|
+
if not tv_config_dir.exists():
|
|
168
|
+
tv_config_dir = pathlib.Path(os.getenv("XDG_CONFIG_HOME", str(pathlib.Path.home() / ".config"))) / "television"
|
|
169
|
+
cable_dir = tv_config_dir / "cable"
|
|
170
|
+
cable_dir.mkdir(parents=True, exist_ok=True)
|
|
171
|
+
temp_channel_link = cable_dir / "temp_options.toml"
|
|
172
|
+
if temp_channel_link.exists() or temp_channel_link.is_symlink():
|
|
173
|
+
temp_channel_link.unlink()
|
|
174
|
+
temp_channel_link.symlink_to(channel_path)
|
|
175
|
+
output_file = tempdir / "selection.txt"
|
|
176
|
+
try:
|
|
177
|
+
result = subprocess.run(["tv", "temp_options"], check=False, stdout=output_file.open("w"), text=True, env=env)
|
|
178
|
+
finally:
|
|
179
|
+
if temp_channel_link.exists() or temp_channel_link.is_symlink():
|
|
180
|
+
temp_channel_link.unlink()
|
|
181
|
+
if result.returncode not in (0, 130):
|
|
182
|
+
raise SystemExit(result.returncode)
|
|
183
|
+
if result.returncode == 130:
|
|
184
|
+
return [] if multi else None
|
|
185
|
+
if not output_file.exists():
|
|
186
|
+
return [] if multi else None
|
|
187
|
+
selected_lines = [line.strip() for line in output_file.read_text().splitlines() if line.strip()]
|
|
188
|
+
if not selected_lines:
|
|
189
|
+
return [] if multi else None
|
|
190
|
+
selected_keys: list[str] = []
|
|
191
|
+
for line in selected_lines:
|
|
192
|
+
try:
|
|
193
|
+
index = int(line)
|
|
194
|
+
key = index_map.get(index)
|
|
195
|
+
if key is not None:
|
|
196
|
+
selected_keys.append(key)
|
|
197
|
+
except ValueError:
|
|
198
|
+
continue
|
|
199
|
+
if multi:
|
|
200
|
+
return selected_keys
|
|
201
|
+
return selected_keys[0] if selected_keys else None
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
if __name__ == "__main__":
|
|
205
|
+
demo_mapping: dict[str, str] = {
|
|
206
|
+
"Option 1": "# Option 1\nThis is the preview for option 1.",
|
|
207
|
+
"Option 2": "# Option 2\nThis is the preview for option 2.",
|
|
208
|
+
"Option 3": "# Option 3\nThis is the preview for option 3."
|
|
209
|
+
}
|
|
210
|
+
result = select_from_options(demo_mapping, multi=True, extension="md", preview_size_percent=50)
|
|
211
|
+
print(f"Selected: {result}")
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
import pathlib
|
|
3
|
+
import pprint
|
|
4
|
+
import shutil
|
|
5
|
+
from typing import Any, Literal, Union, overload
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def _format_preview_value(value: Any) -> str:
|
|
9
|
+
if isinstance(value, str):
|
|
10
|
+
return value
|
|
11
|
+
return pprint.pformat(value, width=88, sort_dicts=True)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _normalize_extension(extension: str | None) -> str | None:
|
|
15
|
+
if extension is None:
|
|
16
|
+
return None
|
|
17
|
+
trimmed = extension.strip()
|
|
18
|
+
if trimmed.startswith("."):
|
|
19
|
+
trimmed = trimmed[1:]
|
|
20
|
+
if not trimmed:
|
|
21
|
+
return None
|
|
22
|
+
return trimmed
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@overload
|
|
26
|
+
def select_from_options(options_to_preview_mapping: dict[str, Any], extension: str | None, multi: Literal[True], preview_size_percent: float) -> list[str]: ...
|
|
27
|
+
@overload
|
|
28
|
+
def select_from_options(options_to_preview_mapping: dict[str, Any], extension: str | None, multi: Literal[False], preview_size_percent: float) -> str | None: ...
|
|
29
|
+
def select_from_options(options_to_preview_mapping: dict[str, Any], extension: str | None, multi: bool, preview_size_percent: float) -> Union[list[str], Union[str, None]]:
|
|
30
|
+
keys = list(options_to_preview_mapping.keys())
|
|
31
|
+
if not keys:
|
|
32
|
+
return [] if multi else None
|
|
33
|
+
normalized_extension = _normalize_extension(extension)
|
|
34
|
+
preview_panel_size = max(10, min(90, int(preview_size_percent)))
|
|
35
|
+
from machineconfig.utils.accessories import randstr
|
|
36
|
+
tempdir = pathlib.Path.home() / "tmp_results" / "tmp_files" / f"tv_channel_{randstr(6)}"
|
|
37
|
+
tempdir.mkdir(parents=True, exist_ok=True)
|
|
38
|
+
try:
|
|
39
|
+
index_map: dict[str, str] = {}
|
|
40
|
+
ext_for_preview = normalized_extension or "txt"
|
|
41
|
+
entries_lines: list[str] = []
|
|
42
|
+
for idx, key in enumerate(keys):
|
|
43
|
+
display_key = key.replace("\n", " ")
|
|
44
|
+
entries_lines.append(f"{idx}|{display_key}")
|
|
45
|
+
index_map[str(idx)] = key
|
|
46
|
+
preview_value = _format_preview_value(options_to_preview_mapping[key])
|
|
47
|
+
preview_file = tempdir / f"{idx}.{ext_for_preview}"
|
|
48
|
+
preview_file.write_text(preview_value, encoding="utf-8")
|
|
49
|
+
entries_path = tempdir / "entries.txt"
|
|
50
|
+
entries_path.write_text("\n".join(entries_lines), encoding="utf-8")
|
|
51
|
+
output_file = tempdir / "selection.txt"
|
|
52
|
+
tempdir_fwd = str(tempdir).replace("\\", "/")
|
|
53
|
+
source_cmd = f"cmd /C type \"{entries_path}\""
|
|
54
|
+
preview_cmd = f"bat --force-colorization --style=plain --paging=never {tempdir_fwd}/{{split:|:0}}.{ext_for_preview}"
|
|
55
|
+
tv_cmd = f'''$OutputEncoding = [Console]::InputEncoding = [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
|
|
56
|
+
tv --ansi --source-command '{source_cmd}' --source-display '{{split:|:1}}' --source-output '{{split:|:0}}' --preview-command '{preview_cmd}' --preview-size {preview_panel_size} --no-remote | Out-File -Encoding utf8 -FilePath "{output_file}"
|
|
57
|
+
'''
|
|
58
|
+
from machineconfig.utils.code import run_shell_script
|
|
59
|
+
result = run_shell_script(tv_cmd, display_script=False, clean_env=False)
|
|
60
|
+
if result.returncode not in (0, 130) and not output_file.exists():
|
|
61
|
+
raise SystemExit(result.returncode)
|
|
62
|
+
if result.returncode == 130:
|
|
63
|
+
return [] if multi else None
|
|
64
|
+
if not output_file.exists():
|
|
65
|
+
return [] if multi else None
|
|
66
|
+
selected_lines = [line.strip() for line in output_file.read_text(encoding="utf-8-sig").splitlines() if line.strip()]
|
|
67
|
+
if not selected_lines:
|
|
68
|
+
return [] if multi else None
|
|
69
|
+
selected_keys: list[str] = []
|
|
70
|
+
for line in selected_lines:
|
|
71
|
+
key = index_map.get(line)
|
|
72
|
+
if key is not None:
|
|
73
|
+
selected_keys.append(key)
|
|
74
|
+
if multi:
|
|
75
|
+
return selected_keys
|
|
76
|
+
return selected_keys[0] if selected_keys else None
|
|
77
|
+
finally:
|
|
78
|
+
shutil.rmtree(tempdir, ignore_errors=True)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
if __name__ == "__main__":
|
|
82
|
+
demo_mapping: dict[str, str] = {
|
|
83
|
+
"Option 1": "# Option 1\nThis is the preview for option 1.",
|
|
84
|
+
"Option 2": "# Option 2\nThis is the preview for option 2.",
|
|
85
|
+
"Option 3": "# Option 3\nThis is the preview for option 3."
|
|
86
|
+
}
|
|
87
|
+
result = select_from_options(demo_mapping, multi=True, extension="md", preview_size_percent=50)
|
|
88
|
+
print(f"Selected: {result}")
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from typing import Any, Literal, overload
|
|
2
|
+
import platform
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
@overload
|
|
6
|
+
def choose_from_dict_with_preview(options_to_preview_mapping: dict[str, Any], extension: str | None, multi: Literal[False], preview_size_percent: float) -> str | None: ...
|
|
7
|
+
@overload
|
|
8
|
+
def choose_from_dict_with_preview(options_to_preview_mapping: dict[str, Any], extension: str | None, multi: Literal[True], preview_size_percent: float) -> list[str]: ...
|
|
9
|
+
def choose_from_dict_with_preview(options_to_preview_mapping: dict[str, Any], extension: str | None, multi: bool, preview_size_percent: float) -> str | list[str] | None:
|
|
10
|
+
if not options_to_preview_mapping:
|
|
11
|
+
return [] if multi else None
|
|
12
|
+
system = platform.system()
|
|
13
|
+
if system == "Windows":
|
|
14
|
+
from machineconfig.utils.options_utils.options_tv_windows import select_from_options
|
|
15
|
+
return select_from_options(options_to_preview_mapping, extension=extension, multi=multi, preview_size_percent=preview_size_percent)
|
|
16
|
+
else:
|
|
17
|
+
from machineconfig.utils.options_utils.options_tv_linux import select_from_options
|
|
18
|
+
return select_from_options(options_to_preview_mapping= options_to_preview_mapping, extension=extension, multi=multi, preview_size_percent=preview_size_percent)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
if __name__ == "__main__":
|
|
22
|
+
demo_mapping: dict[str, str] = {
|
|
23
|
+
"config.py": """from pathlib import Path
|
|
24
|
+
|
|
25
|
+
CONFIG_DIR = Path.home() / ".config"
|
|
26
|
+
DEBUG = True
|
|
27
|
+
""",
|
|
28
|
+
"utils.py": """def greet(name: str) -> str:
|
|
29
|
+
return f"Hello, {name}!"
|
|
30
|
+
""",
|
|
31
|
+
"main.rs": """fn main() {
|
|
32
|
+
println!("Hello, world!");
|
|
33
|
+
}
|
|
34
|
+
""",
|
|
35
|
+
}
|
|
36
|
+
result = choose_from_dict_with_preview(demo_mapping, extension="py", multi=True, preview_size_percent=50)
|
|
37
|
+
print(f"Selected: {result}")
|
|
@@ -103,7 +103,7 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
|
|
|
103
103
|
slf = self.expanduser().resolve()
|
|
104
104
|
if content:
|
|
105
105
|
assert self.is_dir(), NotADirectoryError(f"💥 When `content` flag is set to True, path must be a directory. It is not: `{repr(self)}`")
|
|
106
|
-
[x.move(folder=path.parent, content=False, overwrite=overwrite) for x in self.
|
|
106
|
+
[x.move(folder=path.parent, content=False, overwrite=overwrite) for x in self.glob("*")]
|
|
107
107
|
return path # contents live within this directory.
|
|
108
108
|
if overwrite:
|
|
109
109
|
tmp_path = slf.rename(path.parent.absolute() / randstr())
|
|
@@ -174,7 +174,8 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
|
|
|
174
174
|
appended_name = f"""{name}_{len(self.parent.search(f"*{self.name.split('.')[0]}*"))}"""
|
|
175
175
|
return self.append(name=appended_name, index=False, verbose=verbose, suffix=suffix, **kwargs)
|
|
176
176
|
full_name = name or ("_" + str(timestamp()))
|
|
177
|
-
|
|
177
|
+
whatever = ("bruh" + self)
|
|
178
|
+
full_suffix = suffix or "".join(whatever.suffixes)
|
|
178
179
|
subpath = self.name.split(".")[0] + full_name + full_suffix
|
|
179
180
|
dest = self.parent.joinpath(subpath)
|
|
180
181
|
res = PathExtended(dest)
|
|
@@ -294,7 +295,7 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
|
|
|
294
295
|
target = "BROKEN LINK " + str(self) # avoid infinite recursions for broken links.
|
|
295
296
|
return "🔗 Symlink '" + str(self) + "' ==> " + (str(target) if target == self else str(target))
|
|
296
297
|
elif self.is_absolute():
|
|
297
|
-
return self._type() + " '" + str(self.clickable()) + "'" + (" | " + datetime.fromtimestamp(self.stat().st_ctime).isoformat()[:-7].replace("T", " ") if self.exists() else "") + (f" | {self.
|
|
298
|
+
return self._type() + " '" + str(self.clickable()) + "'" + (" | " + datetime.fromtimestamp(self.stat().st_ctime).isoformat()[:-7].replace("T", " ") if self.exists() else "") + (f" | {round(self.stat().st_size / (1024**2), 1)} Mb" if self.is_file() else "")
|
|
298
299
|
elif "http" in str(self):
|
|
299
300
|
return "🕸️ URL " + str(self.as_url_str())
|
|
300
301
|
else:
|
|
@@ -476,7 +477,6 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
|
|
|
476
477
|
verbose: bool = True,
|
|
477
478
|
content: bool = False,
|
|
478
479
|
orig: bool = False,
|
|
479
|
-
pwd: Optional[str] = None,
|
|
480
480
|
mode: FILE_MODE = "w",
|
|
481
481
|
**kwargs: Any,
|
|
482
482
|
) -> "PathExtended":
|
|
@@ -493,7 +493,6 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
|
|
|
493
493
|
path_resolved = PathExtended(op_zip)
|
|
494
494
|
else:
|
|
495
495
|
import shutil
|
|
496
|
-
|
|
497
496
|
if content:
|
|
498
497
|
root_dir, base_dir = slf, "."
|
|
499
498
|
else:
|
|
@@ -501,7 +500,7 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
|
|
|
501
500
|
base_name = str(path_resolved)[:-4] if str(path_resolved).endswith(".zip") else str(path_resolved)
|
|
502
501
|
op_zip = shutil.make_archive(base_name=base_name, format="zip", root_dir=str(root_dir), base_dir=str(base_dir), verbose=False, **kwargs)
|
|
503
502
|
path_resolved = PathExtended(op_zip)
|
|
504
|
-
msg = f"ZIPPED {repr(slf)} ==>
|
|
503
|
+
msg = f"ZIPPED {repr(slf)} ==> {repr(path_resolved)}"
|
|
505
504
|
res_out = PathExtended(path_resolved)
|
|
506
505
|
ret = self if orig else res_out
|
|
507
506
|
delayed_msg = ""
|
|
@@ -538,7 +537,9 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
|
|
|
538
537
|
assert merge is False, "I have not implemented this yet"
|
|
539
538
|
assert path is None, "I have not implemented this yet"
|
|
540
539
|
if tmp:
|
|
541
|
-
|
|
540
|
+
tmp_root = PathExtended("~/tmp_results").expanduser()
|
|
541
|
+
tmp_root.mkdir(parents=True, exist_ok=True)
|
|
542
|
+
return self.unzip(folder=tmp_root.joinpath("tmp_unzips").joinpath(randstr()), content=True).joinpath(self.stem)
|
|
542
543
|
slf = zipfile__ = self.expanduser().resolve()
|
|
543
544
|
if any(ztype in str(slf.parent) for ztype in (".zip", ".7z")): # path include a zip archive in the middle.
|
|
544
545
|
tmp__ = [item for item in (".zip", ".7z", "") if item in str(slf)]
|
machineconfig/utils/procs.py
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import psutil
|
|
4
4
|
from rich.progress import Progress, SpinnerColumn, TextColumn
|
|
5
|
-
from
|
|
6
|
-
from typing import Optional, TypedDict, List, Dict
|
|
5
|
+
from typing import Optional, TypedDict, List
|
|
7
6
|
from rich.console import Console
|
|
8
7
|
from rich.panel import Panel
|
|
9
8
|
from datetime import datetime
|
|
@@ -36,7 +35,7 @@ def get_processes_accessing_file(path: str) -> List[FileAccessInfo]:
|
|
|
36
35
|
# header for searching processes
|
|
37
36
|
title = "🔍 SEARCHING FOR PROCESSES ACCESSING FILE"
|
|
38
37
|
console.print(Panel(title, title="[bold blue]Process Info[/bold blue]", border_style="blue"))
|
|
39
|
-
res:
|
|
38
|
+
res: list[FileAccessInfo] = []
|
|
40
39
|
|
|
41
40
|
with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress:
|
|
42
41
|
progress.add_task("🔎 Scanning processes...", total=None)
|
|
@@ -48,10 +47,10 @@ def get_processes_accessing_file(path: str) -> List[FileAccessInfo]:
|
|
|
48
47
|
continue
|
|
49
48
|
tmp = [file.path for file in files if path in file.path]
|
|
50
49
|
if len(tmp) > 0:
|
|
51
|
-
res
|
|
50
|
+
res.append({"pid": proc.pid, "files": tmp})
|
|
52
51
|
|
|
53
52
|
# Convert to list of dictionaries for consistent data structure
|
|
54
|
-
result_data: List[FileAccessInfo] =
|
|
53
|
+
result_data: List[FileAccessInfo] = res
|
|
55
54
|
console.print(Panel(f"✅ Found {len(res)} processes accessing the specified file", title="[bold blue]Process Info[/bold blue]", border_style="blue"))
|
|
56
55
|
return result_data
|
|
57
56
|
|
|
@@ -99,7 +98,7 @@ class ProcessManager:
|
|
|
99
98
|
|
|
100
99
|
# Sort by memory usage (descending)
|
|
101
100
|
process_info.sort(key=lambda x: x["memory_usage_mb"], reverse=True)
|
|
102
|
-
self.data = process_info
|
|
101
|
+
self.data: list[ProcessInfo] = process_info
|
|
103
102
|
console.print(Panel(f"✅ Process Manager initialized with {len(process_info)} processes", title="[bold blue]Process Info[/bold blue]", border_style="blue"))
|
|
104
103
|
|
|
105
104
|
def _format_process_table(self) -> str:
|
|
@@ -121,22 +120,36 @@ class ProcessManager:
|
|
|
121
120
|
return "\n".join(lines)
|
|
122
121
|
|
|
123
122
|
def choose_and_kill(self):
|
|
124
|
-
# header for interactive process selection
|
|
125
|
-
title = "🎯 INTERACTIVE PROCESS SELECTION AND TERMINATION"
|
|
126
|
-
console.print(Panel(title, title="[bold blue]Process Info[/bold blue]", border_style="blue"))
|
|
127
|
-
# Format data as table for display
|
|
128
|
-
formatted_data = self._format_process_table()
|
|
129
|
-
all_lines = formatted_data.split("\n")
|
|
130
|
-
header_and_separator = all_lines[:2] # First two lines: header and separator
|
|
131
|
-
options = all_lines[2:] # Skip header and separator, only process lines
|
|
132
|
-
|
|
133
|
-
#
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
print(
|
|
139
|
-
print(
|
|
123
|
+
# # header for interactive process selection
|
|
124
|
+
# title = "🎯 INTERACTIVE PROCESS SELECTION AND TERMINATION"
|
|
125
|
+
# console.print(Panel(title, title="[bold blue]Process Info[/bold blue]", border_style="blue"))
|
|
126
|
+
# # Format data as table for display
|
|
127
|
+
# formatted_data = self._format_process_table()
|
|
128
|
+
# all_lines = formatted_data.split("\n")
|
|
129
|
+
# header_and_separator = all_lines[:2] # First two lines: header and separator
|
|
130
|
+
# options = all_lines[2:] # Skip header and separator, only process lines
|
|
131
|
+
# from machineconfig.utils.options import choose_from_options
|
|
132
|
+
# res = choose_from_options(options=all_lines, msg="📋 Select processes to manage:", tv=True, multi=True)
|
|
133
|
+
# # Filter out header and separator if they were selected
|
|
134
|
+
# selected_lines = [line for line in res if line not in header_and_separator]
|
|
135
|
+
# indices = [options.index(val) for val in selected_lines]
|
|
136
|
+
# selected_processes = [self.data[i] for i in indices]
|
|
137
|
+
# print("\n📊 All Processes:")
|
|
138
|
+
# print(formatted_data)
|
|
139
|
+
# print("\n🎯 Selected Processes:")
|
|
140
|
+
|
|
141
|
+
from machineconfig.utils.options_utils.tv_options import choose_from_dict_with_preview
|
|
142
|
+
# def choose_from_dict_with_preview(options_to_preview_mapping: dict[str, Any], extension: str | None, multi: bool, preview_size_percent: float) -> str | list[str] | None:
|
|
143
|
+
|
|
144
|
+
import json
|
|
145
|
+
commands = choose_from_dict_with_preview(
|
|
146
|
+
options_to_preview_mapping={str(proc["command"]): json.dumps({k: str(v) for k, v in proc.items()}, indent=2) for proc in self.data},
|
|
147
|
+
multi=True,
|
|
148
|
+
extension="json",
|
|
149
|
+
preview_size_percent=70,
|
|
150
|
+
)
|
|
151
|
+
selected_processes = [proc for proc in self.data if str(proc["command"]) in commands]
|
|
152
|
+
|
|
140
153
|
for process in selected_processes:
|
|
141
154
|
print(f"PID: {process['pid']}, Name: {process['name']}, Memory: {process['memory_usage_mb']:.2f}MB")
|
|
142
155
|
for idx, process in enumerate(selected_processes):
|
|
@@ -216,10 +229,5 @@ def get_age(create_time: datetime) -> str:
|
|
|
216
229
|
return str(delta).split(".")[0] # remove microseconds
|
|
217
230
|
|
|
218
231
|
|
|
219
|
-
def main():
|
|
220
|
-
from machineconfig.utils.procs import ProcessManager
|
|
221
|
-
ProcessManager().choose_and_kill()
|
|
222
|
-
|
|
223
|
-
|
|
224
232
|
if __name__ == "__main__":
|
|
225
233
|
pass
|
machineconfig/utils/scheduler.py
CHANGED
|
@@ -166,7 +166,10 @@ class CacheMemory[T]():
|
|
|
166
166
|
else:
|
|
167
167
|
age = datetime.now() - self.time_produced
|
|
168
168
|
if (age > self.expire) or (fresh and (age.total_seconds() > tolerance_seconds)):
|
|
169
|
-
|
|
169
|
+
if not fresh:
|
|
170
|
+
self.logger.warning(f"""🔄 CACHE STALE 📦 {self.name} cache: Populating fresh cache from source func. """ + f"""⏱️ Age = {age} > Expiry {self.expire} """ )
|
|
171
|
+
else:
|
|
172
|
+
self.logger.warning(f"""⚠️ Fresh flag raised, age = {age} > {tolerance_seconds} seconds of tolerance. Updating {self.name} cache from source func.""")
|
|
170
173
|
t0 = time.time()
|
|
171
174
|
self.cache = self.source_func()
|
|
172
175
|
self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
|
|
@@ -202,7 +205,10 @@ class Cache[T](): # This class helps to accelrate access to latest data coming
|
|
|
202
205
|
if self.path.exists(): # prefer to read from disk over source func as a default source of cache.
|
|
203
206
|
age = datetime.now() - datetime.fromtimestamp(self.path.stat().st_mtime)
|
|
204
207
|
if (age > self.expire) or (fresh and (age.total_seconds() > tolerance_seconds)): # cache is old or if fresh flag is raised
|
|
205
|
-
|
|
208
|
+
if not fresh:
|
|
209
|
+
self.logger.warning(f"""🔄 CACHE STALE 📦 {self.name} cache: Populating fresh cache from source func. """ + f"""⏱️ Age = {age} > Expiry {self.expire} """ )
|
|
210
|
+
else:
|
|
211
|
+
self.logger.warning(f"""⚠️ Fresh flag raised, age = {age} > {tolerance_seconds} seconds of tolerance. Updating {self.name} cache from source func.""")
|
|
206
212
|
t0 = time.time()
|
|
207
213
|
self.cache = self.source_func() # fresh data.
|
|
208
214
|
self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
|
|
@@ -6,7 +6,7 @@ capturing all user inputs collected during interactive execution.
|
|
|
6
6
|
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
from typing import TypedDict, Literal, NotRequired
|
|
9
|
-
from machineconfig.scripts.python.helpers_agents.fire_agents_help_launch import AGENTS
|
|
9
|
+
from machineconfig.scripts.python.helpers.helpers_agents.fire_agents_help_launch import AGENTS
|
|
10
10
|
|
|
11
11
|
SEARCH_STRATEGIES = Literal["file_path", "keyword_search", "filename_pattern"]
|
|
12
12
|
|
|
@@ -60,3 +60,13 @@ def serialize_layouts_to_file(layouts: list[LayoutConfig], version: Literal["0.1
|
|
|
60
60
|
existing_content_layout["layouts"].append(a_new_layout)
|
|
61
61
|
p.write_text(json.dumps(existing_content_layout, indent=4), encoding="utf-8")
|
|
62
62
|
return None
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def substitute_home(tabs: list[TabConfig]) -> list["TabConfig"]:
|
|
66
|
+
import json
|
|
67
|
+
from pathlib import Path
|
|
68
|
+
json_str = json.dumps(tabs)
|
|
69
|
+
json_str = json_str.replace("~", str(Path.home())).replace("$HOME", str(Path.home()))
|
|
70
|
+
json_str = json_str.replace("""command": "f """, """command": "~/.config/machineconfig/scripts/wrap_mcfg fire """)
|
|
71
|
+
json_str = json_str.replace("""command": "s """, """command": "~/.config/machineconfig/scripts/wrap_mcfg sessions """)
|
|
72
|
+
return json.loads(json_str)
|
|
@@ -5,8 +5,14 @@ Utils
|
|
|
5
5
|
import machineconfig
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
|
|
8
|
-
EXCLUDE_DIRS = [".links", "
|
|
8
|
+
EXCLUDE_DIRS = [".links", "notebooks",
|
|
9
|
+
"GEMINI.md", "CLAUDE.md", "CRUSH.md", "AGENTS.md",
|
|
10
|
+
".cursor", ".clinerules", ".github/instructions", ".github/agents", ".github/prompts",
|
|
11
|
+
".ai",
|
|
12
|
+
".venv", ".git", ".idea", ".vscode", "node_modules", "__pycache__", ".mypy_cache"
|
|
13
|
+
]
|
|
9
14
|
LIBRARY_ROOT = Path(machineconfig.__file__).resolve().parent
|
|
15
|
+
REPO_ROOT = LIBRARY_ROOT.parent.parent
|
|
10
16
|
|
|
11
17
|
CONFIG_ROOT = Path.home().joinpath(".config/machineconfig")
|
|
12
18
|
DEFAULTS_PATH = Path.home().joinpath("dotfiles/machineconfig/defaults.ini")
|