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.
Files changed (353) hide show
  1. machineconfig/cluster/remote/run_cluster.py +1 -1
  2. machineconfig/cluster/remote/run_remote.py +1 -1
  3. machineconfig/cluster/sessions_managers/utils/maker.py +10 -8
  4. machineconfig/cluster/sessions_managers/wt_local.py +1 -1
  5. machineconfig/cluster/sessions_managers/wt_local_manager.py +1 -1
  6. machineconfig/cluster/sessions_managers/zellij_local.py +1 -1
  7. machineconfig/cluster/sessions_managers/zellij_local_manager.py +1 -1
  8. machineconfig/jobs/installer/checks/check_installations.py +133 -0
  9. machineconfig/jobs/installer/checks/install_utils.py +132 -0
  10. machineconfig/jobs/installer/checks/report_utils.py +39 -0
  11. machineconfig/jobs/installer/checks/vt_utils.py +89 -0
  12. machineconfig/jobs/installer/installer_data.json +271 -152
  13. machineconfig/jobs/installer/linux_scripts/docker.sh +6 -9
  14. machineconfig/jobs/installer/package_groups.py +11 -9
  15. machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +1 -2
  16. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +1 -1
  17. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +10 -8
  18. machineconfig/jobs/installer/{custom → python_scripts}/hx.py +30 -13
  19. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +1 -1
  20. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +6 -5
  21. machineconfig/jobs/installer/{custom_dev → python_scripts}/sysabc.py +28 -43
  22. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +1 -1
  23. machineconfig/jobs/installer/{custom → python_scripts}/yazi.py +39 -19
  24. machineconfig/jobs/scripts/powershell_scripts/cmatrix.ps1 +52 -0
  25. machineconfig/jobs/scripts_dynamic/a.py +428 -0
  26. machineconfig/logger.py +1 -1
  27. machineconfig/profile/create_helper.py +21 -10
  28. machineconfig/profile/create_links.py +77 -20
  29. machineconfig/profile/create_links_export.py +63 -58
  30. machineconfig/profile/create_shell_profile.py +14 -0
  31. machineconfig/profile/mapper_data.toml +45 -0
  32. machineconfig/profile/mapper_dotfiles.toml +249 -0
  33. machineconfig/scripts/python/agents.py +76 -171
  34. machineconfig/scripts/python/ai/initai.py +3 -1
  35. machineconfig/scripts/python/ai/scripts/__init__.py +1 -0
  36. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +2 -0
  37. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +8 -6
  38. machineconfig/scripts/python/ai/solutions/claude/claude.py +1 -1
  39. machineconfig/scripts/python/ai/solutions/cline/cline.py +1 -1
  40. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +1 -1
  41. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +29 -0
  42. machineconfig/scripts/python/ai/solutions/crush/crush.py +1 -1
  43. machineconfig/scripts/python/ai/solutions/cursor/cursors.py +1 -1
  44. machineconfig/scripts/python/ai/solutions/gemini/gemini.py +1 -1
  45. machineconfig/scripts/python/ai/solutions/gemini/settings.json +3 -0
  46. machineconfig/scripts/python/ai/{solutions → utils}/generic.py +2 -15
  47. machineconfig/scripts/python/ai/utils/vscode_tasks.py +6 -3
  48. machineconfig/scripts/python/cloud.py +58 -11
  49. machineconfig/scripts/python/croshell.py +4 -155
  50. machineconfig/scripts/python/devops.py +57 -38
  51. machineconfig/scripts/python/devops_navigator.py +17 -3
  52. machineconfig/scripts/python/fire_jobs.py +10 -193
  53. machineconfig/scripts/python/ftpx.py +5 -224
  54. machineconfig/scripts/python/graph/cli_graph.json +8743 -0
  55. machineconfig/scripts/python/{env_manager → helper_env}/path_manager_tui.py +2 -2
  56. machineconfig/scripts/python/{env_manager → helpers/helper_env}/env_manager_tui.py +1 -1
  57. machineconfig/scripts/python/helpers/helper_env/path_manager_tui.py +228 -0
  58. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.py +1 -1
  59. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_cursor_agents.py +1 -1
  60. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_gemini.py +1 -1
  61. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_qwen.py +1 -1
  62. machineconfig/scripts/python/helpers/helpers_agents/agents_impl.py +168 -0
  63. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_launch.py +10 -7
  64. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  65. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  66. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  67. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/crush/crush.json +10 -0
  68. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  69. machineconfig/scripts/python/helpers/helpers_agents/privacy/privacy.py +109 -0
  70. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.sh +3 -1
  71. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_copy.py +6 -6
  72. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_mount.py +10 -5
  73. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_sync.py +4 -4
  74. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers2.py +1 -1
  75. machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +229 -0
  76. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/scheduler.py +4 -4
  77. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/start_slidev.py +7 -6
  78. machineconfig/scripts/python/helpers/helpers_devops/backup_config.py +149 -0
  79. machineconfig/scripts/python/helpers/helpers_devops/cli_backup_retrieve.py +262 -0
  80. machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +130 -0
  81. machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
  82. machineconfig/scripts/python/helpers/helpers_devops/cli_config_mount.py +77 -0
  83. machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +71 -0
  84. machineconfig/scripts/python/helpers/helpers_devops/cli_nw.py +285 -0
  85. machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +274 -0
  86. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_self.py +84 -33
  87. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_file.py +44 -30
  88. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_server.py +26 -43
  89. machineconfig/scripts/python/helpers/helpers_devops/cli_share_temp.py +69 -0
  90. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_terminal.py +12 -6
  91. machineconfig/scripts/python/helpers/helpers_devops/cli_ssh.py +167 -0
  92. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_status.py +12 -6
  93. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_update_repos.py +1 -1
  94. machineconfig/scripts/python/{interactive.py → helpers/helpers_devops/interactive.py} +64 -50
  95. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/commands.py +25 -0
  96. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/device_entry.py +17 -0
  97. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/devices.py +17 -0
  98. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/linux.py +103 -0
  99. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/macos.py +100 -0
  100. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/selection.py +47 -0
  101. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/utils.py +28 -0
  102. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/windows.py +91 -0
  103. machineconfig/scripts/python/helpers/helpers_devops/run_script.py +197 -0
  104. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.ps1 +41 -0
  105. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.sh +48 -0
  106. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_wezterm_theme.py +3 -3
  107. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/file_wrangler.py +1 -0
  108. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_args_helper.py +1 -0
  109. machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_impl.py +233 -0
  110. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_route_helper.py +3 -3
  111. machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  112. machineconfig/scripts/python/helpers/helpers_msearch/msearch_impl.py +248 -0
  113. machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_linux/fzfg +4 -3
  114. machineconfig/scripts/python/helpers/helpers_msearch/scripts_linux/search_with_context.sh +48 -0
  115. machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_windows/fzfg.ps1 +2 -7
  116. machineconfig/scripts/python/helpers/helpers_navigator/__init__.py +20 -0
  117. machineconfig/scripts/python/helpers/helpers_navigator/cli_graph_loader.py +234 -0
  118. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/command_builder.py +61 -13
  119. machineconfig/scripts/python/helpers/helpers_navigator/command_detail.py +153 -0
  120. machineconfig/scripts/python/helpers/helpers_navigator/command_tree.py +45 -0
  121. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/data_models.py +18 -11
  122. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/main_app.py +5 -5
  123. machineconfig/scripts/python/helpers/helpers_network/__init__.py +0 -0
  124. machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/address.py +52 -10
  125. machineconfig/scripts/python/helpers/helpers_network/address_switch.py +78 -0
  126. machineconfig/scripts/python/helpers/helpers_network/ftpx_impl.py +276 -0
  127. machineconfig/scripts/python/helpers/helpers_network/ssh/__init__.py +0 -0
  128. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_identity.py +73 -0
  129. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_key_windows.py +23 -0
  130. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_ssh_key.py +169 -0
  131. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_cloud_init.py +33 -0
  132. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_linux.py +338 -0
  133. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_linux_utils.py +35 -0
  134. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_windows.py +245 -0
  135. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_windows_utils.py +34 -0
  136. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action.py +3 -3
  137. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action_helper.py +3 -3
  138. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/cloud_repo_sync.py +120 -37
  139. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/grource.py +3 -2
  140. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/record.py +33 -13
  141. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_2.py +63 -19
  142. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/update.py +0 -6
  143. machineconfig/scripts/python/helpers/helpers_search/script_help.py +81 -0
  144. machineconfig/scripts/python/helpers/helpers_sessions/__init__.py +0 -0
  145. machineconfig/scripts/python/helpers/helpers_sessions/attach_impl.py +87 -0
  146. machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +114 -0
  147. machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +1 -2
  148. machineconfig/scripts/python/helpers/helpers_sessions/utils.py +69 -0
  149. machineconfig/scripts/python/{helpers_utils → helpers/helpers_utils}/download.py +1 -1
  150. machineconfig/scripts/python/{helpers_devops/cli_utils.py → helpers/helpers_utils/pdf.py} +2 -2
  151. machineconfig/scripts/python/{helpers_utils/path.py → helpers/helpers_utils/python.py} +65 -40
  152. machineconfig/scripts/python/helpers/helpers_utils/specs.py +246 -0
  153. machineconfig/scripts/python/mcfg_entry.py +126 -48
  154. machineconfig/scripts/python/msearch.py +16 -61
  155. machineconfig/scripts/python/sessions.py +137 -191
  156. machineconfig/scripts/python/utils.py +104 -24
  157. machineconfig/settings/atuin/config.toml +294 -0
  158. machineconfig/settings/atuin/themes/catppuccin-mocha-mauve.toml +12 -0
  159. machineconfig/settings/linters/.ruff.toml +2 -1
  160. machineconfig/settings/mprocs/windows/mprocs.yaml +2 -2
  161. machineconfig/settings/shells/bash/init.sh +6 -10
  162. machineconfig/settings/shells/nushell/config.nu +23 -1
  163. machineconfig/settings/shells/nushell/env.nu +22 -48
  164. machineconfig/settings/shells/nushell/init.nu +64 -240
  165. machineconfig/settings/shells/pwsh/init.ps1 +71 -5
  166. machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
  167. machineconfig/settings/shells/wezterm/wezterm.lua +4 -0
  168. machineconfig/settings/shells/wt/settings.json +31 -37
  169. machineconfig/settings/shells/zsh/init.sh +25 -5
  170. machineconfig/settings/television/cable_unix/bash-history.toml +1 -1
  171. machineconfig/settings/television/cable_windows/pwsh-history.toml +1 -1
  172. machineconfig/settings/tv/config.toml +234 -0
  173. machineconfig/settings/tv/themes/catppuccin-mocha-sky.toml +22 -0
  174. machineconfig/settings/wsl/.wslconfig +5 -30
  175. machineconfig/settings/wt/__init__.py +0 -0
  176. machineconfig/settings/yazi/yazi_linux.toml +18 -8
  177. machineconfig/settings/zellij/__init__.py +0 -0
  178. machineconfig/settings/zellij/config.kdl +0 -295
  179. machineconfig/settings/zellij/layouts/__init__.py +0 -0
  180. machineconfig/settings/zellij/layouts/st.kdl +39 -9
  181. machineconfig/settings/zellij/layouts/st2.kdl +6 -2
  182. machineconfig/setup_linux/__init__.py +0 -1
  183. machineconfig/setup_linux/apps_desktop.sh +8 -27
  184. machineconfig/setup_linux/web_shortcuts/interactive.sh +10 -10
  185. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +3 -0
  186. machineconfig/setup_mac/__init__.py +0 -2
  187. machineconfig/setup_windows/__init__.py +2 -5
  188. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +14 -13
  189. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +4 -3
  190. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +3 -3
  191. machineconfig/type_hinting/sql/__init__.py +1 -0
  192. machineconfig/type_hinting/sql/base.py +216 -0
  193. machineconfig/type_hinting/sql/core_schema.py +64 -0
  194. machineconfig/type_hinting/sql/core_schema_typeddict.py +41 -0
  195. machineconfig/type_hinting/sql/typeddict_codegen.py +222 -0
  196. machineconfig/type_hinting/typedict/__init__.py +1 -0
  197. machineconfig/type_hinting/typedict/ast_utils.py +130 -0
  198. machineconfig/type_hinting/typedict/generator_helpers.py +319 -0
  199. machineconfig/type_hinting/typedict/generators.py +231 -0
  200. machineconfig/type_hinting/typedict/polars_schema.py +24 -0
  201. machineconfig/type_hinting/typedict/polars_schema_typeddict.py +63 -0
  202. machineconfig/utils/accessories.py +24 -0
  203. machineconfig/utils/code.py +78 -33
  204. machineconfig/utils/files/ascii_art.py +10 -14
  205. machineconfig/utils/files/headers.py +3 -5
  206. machineconfig/utils/files/read.py +8 -1
  207. machineconfig/utils/installer_utils/github_release_bulk.py +11 -91
  208. machineconfig/utils/installer_utils/github_release_scraper.py +99 -0
  209. machineconfig/utils/installer_utils/install_from_url.py +1 -1
  210. machineconfig/utils/installer_utils/installer_class.py +12 -4
  211. machineconfig/utils/installer_utils/installer_cli.py +7 -17
  212. machineconfig/utils/installer_utils/installer_helper.py +52 -36
  213. machineconfig/utils/installer_utils/installer_locator_utils.py +15 -25
  214. machineconfig/utils/installer_utils/installer_runner.py +4 -4
  215. machineconfig/utils/io.py +25 -8
  216. machineconfig/utils/meta.py +6 -4
  217. machineconfig/utils/options.py +49 -19
  218. machineconfig/utils/options_utils/__init__.py +0 -0
  219. machineconfig/utils/options_utils/options_tv_linux.py +211 -0
  220. machineconfig/utils/options_utils/options_tv_windows.py +88 -0
  221. machineconfig/utils/options_utils/tv_options.py +37 -0
  222. machineconfig/utils/path_extended.py +8 -7
  223. machineconfig/utils/procs.py +35 -27
  224. machineconfig/utils/scheduler.py +8 -2
  225. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  226. machineconfig/utils/schemas/layouts/layout_types.py +10 -0
  227. machineconfig/utils/source_of_truth.py +7 -1
  228. machineconfig/utils/ssh.py +73 -23
  229. machineconfig/utils/ssh_utils/abc.py +1 -1
  230. machineconfig/utils/ssh_utils/copy_from_here.py +19 -14
  231. machineconfig/utils/ssh_utils/copy_to_here.py +2 -1
  232. machineconfig/utils/ssh_utils/utils.py +23 -7
  233. machineconfig/utils/ssh_utils/wsl.py +107 -170
  234. machineconfig/utils/ssh_utils/wsl_helper.py +217 -0
  235. machineconfig/utils/upgrade_packages.py +4 -8
  236. {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/METADATA +30 -23
  237. machineconfig-8.61.dist-info/RECORD +539 -0
  238. {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/entry_points.txt +0 -1
  239. machineconfig/jobs/installer/check_installations.py +0 -248
  240. machineconfig/profile/backup.toml +0 -49
  241. machineconfig/profile/mapper.toml +0 -263
  242. machineconfig/scripts/linux/other/share_cloud.sh +0 -64
  243. machineconfig/scripts/linux/other/share_nfs +0 -49
  244. machineconfig/scripts/linux/other/start_docker +0 -23
  245. machineconfig/scripts/linux/other/switch_ip +0 -20
  246. machineconfig/scripts/python/helpers/run_py_script.py +0 -79
  247. machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +0 -26
  248. machineconfig/scripts/python/helpers_devops/cli_config.py +0 -105
  249. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +0 -89
  250. machineconfig/scripts/python/helpers_devops/cli_data.py +0 -25
  251. machineconfig/scripts/python/helpers_devops/cli_nw.py +0 -214
  252. machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -215
  253. machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +0 -80
  254. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +0 -3
  255. machineconfig/scripts/python/helpers_navigator/__init__.py +0 -20
  256. machineconfig/scripts/python/helpers_navigator/command_detail.py +0 -44
  257. machineconfig/scripts/python/helpers_navigator/command_tree.py +0 -620
  258. machineconfig/scripts/python/helpers_network/devops_add_identity.py +0 -82
  259. machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +0 -153
  260. machineconfig/scripts/python/helpers_network/mount_drive +0 -128
  261. machineconfig/scripts/python/helpers_network/mount_nfs +0 -49
  262. machineconfig/scripts/python/helpers_network/mount_nfs.py +0 -85
  263. machineconfig/scripts/python/helpers_network/mount_nw_drive +0 -61
  264. machineconfig/scripts/python/helpers_network/mount_nw_drive.py +0 -48
  265. machineconfig/scripts/python/helpers_network/mount_smb +0 -3
  266. machineconfig/scripts/python/helpers_network/mount_ssh.py +0 -64
  267. machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +0 -391
  268. machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +0 -338
  269. machineconfig/scripts/python/helpers_network/wsl_windows_transfer.py +0 -67
  270. machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -77
  271. machineconfig/scripts/python/terminal.py +0 -133
  272. machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +0 -92
  273. machineconfig/scripts/windows/mounts/mount_nfs.ps1 +0 -42
  274. machineconfig/scripts/windows/mounts/mount_nw.ps1 +0 -9
  275. machineconfig/scripts/windows/mounts/mount_smb.ps1 +0 -2
  276. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  277. machineconfig/scripts/windows/mounts/share_cloud.cmd +0 -34
  278. machineconfig/scripts/windows/mounts/share_smb.ps1 +0 -16
  279. machineconfig/settings/zellij/config.orig.kdl +0 -295
  280. machineconfig/setup_linux/others/android.sh +0 -2
  281. machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -30
  282. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  283. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  284. machineconfig/setup_mac/ssh/openssh_setup.sh +0 -114
  285. machineconfig/setup_windows/others/docker.ps1 +0 -7
  286. machineconfig/setup_windows/others/obs.ps1 +0 -4
  287. machineconfig/setup_windows/others/power_options.ps1 +0 -7
  288. machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -29
  289. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  290. machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -37
  291. machineconfig/setup_windows/ssh/openssh-server_add_key.ps1 +0 -7
  292. machineconfig/setup_windows/ssh/openssh-server_copy-ssh-id.ps1 +0 -14
  293. machineconfig/utils/options_tv.py +0 -119
  294. machineconfig/utils/tst.py +0 -20
  295. machineconfig-7.98.dist-info/RECORD +0 -504
  296. /machineconfig/{jobs/installer/custom_dev → cluster/sessions_managers/wt_utils/examples}/__init__.py +0 -0
  297. /machineconfig/{scripts/python/helpers_agents → jobs/installer/checks}/__init__.py +0 -0
  298. /machineconfig/{scripts/python/helpers_agents/agentic_frameworks → jobs/installer/python_scripts}/__init__.py +0 -0
  299. /machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  300. /machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  301. /machineconfig/jobs/installer/{custom_dev → python_scripts}/cloudflare_warp_cli.py +0 -0
  302. /machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  303. /machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +0 -0
  304. /machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  305. /machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  306. /machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  307. /machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  308. /machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  309. /machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +0 -0
  310. /machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
  311. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  312. /machineconfig/scripts/python/ai/{solutions/_shared.py → utils/shared.py} +0 -0
  313. /machineconfig/scripts/python/{helpers_cloud → graph}/__init__.py +0 -0
  314. /machineconfig/scripts/python/{helpers_croshell → helpers}/__init__.py +0 -0
  315. /machineconfig/scripts/python/{env_manager → helpers/helper_env}/__init__.py +0 -0
  316. /machineconfig/scripts/python/{env_manager → helpers/helper_env}/path_manager_backend.py +0 -0
  317. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_agents}/__init__.py +0 -0
  318. /machineconfig/scripts/python/{helpers_devops/themes → helpers/helpers_agents/agentic_frameworks}/__init__.py +0 -0
  319. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.json +0 -0
  320. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_search.py +0 -0
  321. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_helper_types.py +0 -0
  322. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_load_balancer.py +0 -0
  323. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/prompt.txt +0 -0
  324. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.ps1 +0 -0
  325. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_cloud}/__init__.py +0 -0
  326. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_helpers.py +0 -0
  327. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers5.py +0 -0
  328. /machineconfig/scripts/python/{helpers_network → helpers/helpers_croshell}/__init__.py +0 -0
  329. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/crosh.py +0 -0
  330. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/pomodoro.py +0 -0
  331. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer.py +0 -0
  332. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer_template.py +0 -0
  333. /machineconfig/scripts/python/{helpers_sessions → helpers/helpers_devops}/__init__.py +0 -0
  334. /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers/helpers_devops/mount_helpers}/__init__.py +0 -0
  335. /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → helpers/helpers_devops/themes/__init__.py} +0 -0
  336. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
  337. /machineconfig/scripts/python/{helpers_fire_command/f.py → helpers/helpers_fire_command/__init__.py} +0 -0
  338. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/cloud_manager.py +0 -0
  339. /machineconfig/scripts/python/{helpers_fire_command/fire_jobs_streamlit_helper.py → helpers/helpers_fire_command/f.py} +0 -0
  340. /machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/__init__.py +0 -0
  341. /machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/search_bar.py +0 -0
  342. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/onetimeshare.py +0 -0
  343. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/wifi_conn.py +0 -0
  344. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/clone.py +0 -0
  345. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_1.py +0 -0
  346. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/sync.py +0 -0
  347. /machineconfig/scripts/python/helpers/{ast_search.py → helpers_search/ast_search.py} +0 -0
  348. /machineconfig/scripts/python/helpers/{qr_code.py → helpers_search/qr_code.py} +0 -0
  349. /machineconfig/scripts/python/helpers/{repo_rag.py → helpers_search/repo_rag.py} +0 -0
  350. /machineconfig/scripts/python/helpers/{symantic_search.py → helpers_search/symantic_search.py} +0 -0
  351. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  352. {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/WHEEL +0 -0
  353. {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.search("*")]
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
- full_suffix = suffix or "".join(("bruh" + self).suffixes)
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.size()} Mb" if self.is_file() else "")
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)} ==> {repr(path)}"
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
- return self.unzip(folder=PathExtended.tmp().joinpath("tmp_unzips").joinpath(randstr()), content=True).joinpath(self.stem)
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)]
@@ -2,8 +2,7 @@
2
2
 
3
3
  import psutil
4
4
  from rich.progress import Progress, SpinnerColumn, TextColumn
5
- from machineconfig.utils.options import choose_from_options
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: Dict[int, List[str]] = {}
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[proc.pid] = tmp
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] = [{"pid": pid, "files": files} for pid, files in res.items()]
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
- 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:")
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
@@ -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
- self.logger.warning(f"""🔄 CACHE UPDATE ⚠️ {self.name} cache: Updating cache from source func. """ + f""" ⏱️ Age = {age} > {self.expire}""" if not fresh else f""" ⏱️ Age = {age}. Fresh flag raised.""")
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
- self.logger.warning(f"""🔄 CACHE STALE 📦 {self.name} cache: Populating fresh cache from source func. """ + f"""⏱️ Age = {age} > Expiry {self.expire} """ if not fresh else """⚠️ Fresh flag raised.""")
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", ".ai", ".venv", ".git", ".idea", ".vscode", "node_modules", "__pycache__", ".mypy_cache"]
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")