machineconfig 6.23__py3-none-any.whl → 8.12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of machineconfig might be problematic. Click here for more details.

Files changed (402) hide show
  1. machineconfig/cluster/remote/cloud_manager.py +1 -1
  2. machineconfig/cluster/remote/distribute.py +0 -1
  3. machineconfig/cluster/remote/file_manager.py +0 -2
  4. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  5. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  6. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  7. machineconfig/cluster/sessions_managers/wt_local.py +16 -221
  8. machineconfig/cluster/sessions_managers/wt_local_manager.py +55 -193
  9. machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
  10. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  11. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  12. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  13. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  14. machineconfig/cluster/sessions_managers/zellij_local.py +3 -3
  15. machineconfig/cluster/sessions_managers/zellij_local_manager.py +5 -3
  16. machineconfig/cluster/sessions_managers/zellij_remote.py +2 -2
  17. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
  18. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +2 -2
  19. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -7
  20. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper_with_panes.py +1 -1
  21. machineconfig/jobs/installer/check_installations.py +0 -1
  22. machineconfig/jobs/installer/installer_data.json +1408 -201
  23. machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
  24. machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
  25. machineconfig/jobs/installer/package_groups.py +63 -92
  26. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  27. machineconfig/jobs/installer/python_scripts/boxes.py +61 -0
  28. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +5 -3
  29. machineconfig/jobs/installer/python_scripts/cloudflare_warp_cli.py +23 -0
  30. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +4 -1
  31. machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +1 -1
  32. machineconfig/jobs/installer/{custom → python_scripts}/hx.py +75 -18
  33. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +2 -2
  34. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +27 -22
  35. machineconfig/jobs/installer/python_scripts/sysabc.py +139 -0
  36. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +2 -19
  37. machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +10 -14
  38. machineconfig/jobs/installer/python_scripts/yazi.py +121 -0
  39. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nfs +0 -1
  40. machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
  41. machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
  42. machineconfig/jobs/scripts_dynamic/a.py +25 -0
  43. machineconfig/logger.py +0 -1
  44. machineconfig/profile/create_helper.py +56 -18
  45. machineconfig/profile/create_links.py +2 -1
  46. machineconfig/profile/create_links_export.py +64 -18
  47. machineconfig/profile/create_shell_profile.py +90 -132
  48. machineconfig/profile/mapper.toml +18 -8
  49. machineconfig/scripts/__init__.py +0 -4
  50. machineconfig/scripts/linux/wrap_mcfg +46 -0
  51. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  52. machineconfig/scripts/python/agents.py +82 -60
  53. machineconfig/scripts/python/ai/initai.py +1 -19
  54. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  55. machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
  56. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +1 -1
  57. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  58. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  59. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  60. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
  61. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -0
  62. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  63. machineconfig/scripts/python/ai/solutions/generic.py +1 -1
  64. machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
  65. machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +7 -2
  66. machineconfig/scripts/python/cloud.py +14 -9
  67. machineconfig/scripts/python/croshell.py +135 -117
  68. machineconfig/scripts/python/devops.py +48 -25
  69. machineconfig/scripts/python/devops_navigator.py +1 -5
  70. machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
  71. machineconfig/scripts/python/env_manager/path_manager_tui.py +18 -9
  72. machineconfig/scripts/python/fire_jobs.py +127 -118
  73. machineconfig/scripts/python/ftpx.py +44 -17
  74. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  75. machineconfig/scripts/python/helpers/qr_code.py +166 -0
  76. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  77. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  78. machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
  79. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  80. machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
  81. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  82. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  83. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_launch.py +37 -15
  84. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
  85. machineconfig/scripts/python/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  86. machineconfig/scripts/python/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  87. machineconfig/scripts/python/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  88. machineconfig/scripts/python/helpers_agents/privacy/configs/crush/crush.json +10 -0
  89. machineconfig/scripts/python/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  90. machineconfig/scripts/python/helpers_agents/privacy/privacy.py +109 -0
  91. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
  92. machineconfig/scripts/python/helpers_agents/templates/template.sh +34 -0
  93. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_copy.py +28 -21
  94. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_mount.py +19 -17
  95. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_sync.py +12 -11
  96. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/helpers2.py +1 -1
  97. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  98. machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/start_slidev.py +6 -7
  99. machineconfig/scripts/python/helpers_devops/cli_config.py +105 -0
  100. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  101. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  102. machineconfig/scripts/python/helpers_devops/cli_nw.py +221 -0
  103. machineconfig/scripts/python/{devops_helpers → helpers_devops}/cli_repos.py +60 -36
  104. machineconfig/scripts/python/helpers_devops/cli_self.py +172 -0
  105. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  106. machineconfig/scripts/python/helpers_devops/cli_share_server.py +142 -0
  107. machineconfig/scripts/python/{devops_helpers/cli_terminal.py → helpers_devops/cli_share_terminal.py} +15 -17
  108. machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_backup_retrieve.py +7 -10
  109. machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_status.py +7 -19
  110. machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_update_repos.py +1 -1
  111. machineconfig/scripts/python/helpers_devops/run_script.py +168 -0
  112. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  113. machineconfig/scripts/python/{devops_helpers → helpers_devops}/themes/choose_wezterm_theme.py +1 -1
  114. machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -20
  115. machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +2 -0
  116. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +26 -16
  117. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  118. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
  119. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  120. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  121. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_builder.py +1 -1
  122. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_detail.py +1 -1
  123. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_tree.py +160 -23
  124. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/main_app.py +5 -5
  125. machineconfig/scripts/python/helpers_network/address.py +176 -0
  126. machineconfig/scripts/python/helpers_network/address_switch.py +78 -0
  127. machineconfig/scripts/python/{nw → helpers_network}/mount_nfs.py +2 -2
  128. machineconfig/scripts/python/{nw → helpers_network}/mount_ssh.py +1 -1
  129. machineconfig/scripts/python/{nw/devops_add_identity.py → helpers_network/ssh_add_identity.py} +35 -1
  130. machineconfig/scripts/python/{nw/devops_add_ssh_key.py → helpers_network/ssh_add_ssh_key.py} +26 -7
  131. machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_linux.py +7 -7
  132. machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_windows.py +4 -4
  133. machineconfig/scripts/python/{nw → helpers_network}/wifi_conn.py +1 -53
  134. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  135. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  136. machineconfig/scripts/python/{repos_helpers → helpers_repos}/clone.py +0 -1
  137. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +80 -37
  138. machineconfig/scripts/python/{repos_helpers → helpers_repos}/entrypoint.py +5 -5
  139. machineconfig/scripts/python/helpers_repos/grource.py +2 -2
  140. machineconfig/scripts/python/{repos_helpers → helpers_repos}/record.py +3 -2
  141. machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
  142. machineconfig/scripts/python/{repos_helpers/count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
  143. machineconfig/scripts/python/{repos_helpers → helpers_repos}/sync.py +5 -5
  144. machineconfig/scripts/python/{sessions_helpers → helpers_sessions}/sessions_multiprocess.py +19 -13
  145. machineconfig/scripts/python/helpers_utils/download.py +150 -0
  146. machineconfig/scripts/python/helpers_utils/pdf.py +96 -0
  147. machineconfig/scripts/python/helpers_utils/python.py +187 -0
  148. machineconfig/scripts/python/interactive.py +26 -35
  149. machineconfig/scripts/python/{entry.py → mcfg_entry.py} +24 -10
  150. machineconfig/scripts/python/msearch.py +72 -0
  151. machineconfig/scripts/python/sessions.py +101 -38
  152. machineconfig/scripts/python/terminal.py +136 -0
  153. machineconfig/scripts/python/utils.py +62 -0
  154. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  155. machineconfig/settings/broot/conf.toml +1 -1
  156. machineconfig/settings/helix/config.toml +16 -0
  157. machineconfig/settings/helix/languages.toml +13 -4
  158. machineconfig/settings/helix/yazi-picker.sh +12 -0
  159. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  160. machineconfig/settings/lf/linux/exe/previewer.sh +3 -2
  161. machineconfig/settings/lf/linux/lfrc +10 -11
  162. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  163. machineconfig/settings/lf/windows/lfrc +15 -17
  164. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  165. machineconfig/settings/linters/.ruff.toml +1 -1
  166. machineconfig/settings/marimo/marimo.toml +80 -0
  167. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  168. machineconfig/settings/shells/bash/init.sh +57 -10
  169. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  170. machineconfig/settings/shells/nushell/config.nu +2 -35
  171. machineconfig/settings/shells/nushell/env.nu +45 -6
  172. machineconfig/settings/shells/nushell/init.nu +314 -0
  173. machineconfig/settings/shells/pwsh/init.ps1 +59 -23
  174. machineconfig/settings/shells/starship/starship.toml +16 -0
  175. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  176. machineconfig/settings/shells/wt/settings.json +32 -17
  177. machineconfig/settings/shells/zsh/init.sh +89 -0
  178. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  179. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  180. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  181. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  182. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  183. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  184. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  185. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  186. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  187. machineconfig/settings/television/cable_unix/env.toml +17 -0
  188. machineconfig/settings/television/cable_unix/files.toml +11 -0
  189. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  190. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  191. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  192. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  193. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  194. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  195. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  196. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  197. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  198. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  199. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  200. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  201. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  202. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  203. machineconfig/settings/television/cable_unix/text.toml +17 -0
  204. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  205. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  206. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  207. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  208. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  209. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  210. machineconfig/settings/television/cable_windows/env.toml +17 -0
  211. machineconfig/settings/television/cable_windows/files.toml +14 -0
  212. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  213. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  214. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  215. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  216. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  217. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  218. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  219. machineconfig/settings/television/cable_windows/text.toml +17 -0
  220. machineconfig/settings/yazi/init.lua +61 -0
  221. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  222. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  223. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  224. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  225. machineconfig/settings/yazi/theme.toml +4 -0
  226. machineconfig/settings/yazi/yazi_linux.toml +84 -0
  227. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  228. machineconfig/settings/zellij/layouts/st.kdl +39 -8
  229. machineconfig/setup_linux/__init__.py +2 -2
  230. machineconfig/setup_linux/apps_desktop.sh +8 -27
  231. machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -11
  232. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
  233. machineconfig/setup_mac/__init__.py +16 -0
  234. machineconfig/setup_mac/apps_gui.sh +248 -0
  235. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  236. machineconfig/setup_mac/uv.sh +36 -0
  237. machineconfig/setup_windows/__init__.py +3 -5
  238. machineconfig/setup_windows/ssh/openssh-server.ps1 +1 -1
  239. machineconfig/setup_windows/uv.ps1 +8 -1
  240. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +26 -10
  241. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
  242. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  243. machineconfig/utils/accessories.py +7 -5
  244. machineconfig/utils/code.py +143 -167
  245. machineconfig/utils/files/art/fat_croco.txt +10 -0
  246. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  247. machineconfig/utils/files/art/happy_croco.txt +22 -0
  248. machineconfig/utils/files/art/water_croco.txt +11 -0
  249. machineconfig/utils/files/ascii_art.py +1 -1
  250. machineconfig/utils/files/headers.py +6 -11
  251. machineconfig/utils/files/read.py +3 -9
  252. machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
  253. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  254. machineconfig/utils/installer_utils/installer_class.py +44 -101
  255. machineconfig/utils/installer_utils/installer_cli.py +175 -0
  256. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  257. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +39 -87
  258. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +17 -63
  259. machineconfig/utils/io.py +77 -4
  260. machineconfig/utils/links.py +56 -38
  261. machineconfig/utils/meta.py +235 -145
  262. machineconfig/utils/options.py +46 -18
  263. machineconfig/utils/options_tv.py +119 -0
  264. machineconfig/utils/path_extended.py +46 -97
  265. machineconfig/utils/path_helper.py +76 -23
  266. machineconfig/utils/procs.py +10 -23
  267. machineconfig/utils/scheduler.py +84 -115
  268. machineconfig/utils/scheduling.py +0 -3
  269. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  270. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  271. machineconfig/utils/ssh.py +214 -476
  272. machineconfig/utils/ssh_utils/abc.py +5 -0
  273. machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
  274. machineconfig/utils/ssh_utils/copy_to_here.py +303 -0
  275. machineconfig/utils/ssh_utils/utils.py +142 -0
  276. machineconfig/utils/ssh_utils/wsl.py +210 -0
  277. machineconfig/utils/terminal.py +3 -113
  278. machineconfig/utils/upgrade_packages.py +114 -28
  279. machineconfig/utils/ve.py +12 -4
  280. machineconfig-8.12.dist-info/METADATA +132 -0
  281. machineconfig-8.12.dist-info/RECORD +504 -0
  282. {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/entry_points.txt +5 -1
  283. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
  284. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
  285. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  286. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  287. machineconfig/jobs/python/vscode/api.py +0 -57
  288. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -12
  289. machineconfig/jobs/windows/archive/openssh-server_add_key.ps1 +0 -7
  290. machineconfig/jobs/windows/archive/openssh-server_copy-ssh-id.ps1 +0 -14
  291. machineconfig/scripts/linux/fzf2g +0 -21
  292. machineconfig/scripts/linux/fzfag +0 -17
  293. machineconfig/scripts/linux/fzffg +0 -25
  294. machineconfig/scripts/linux/fzfrga +0 -21
  295. machineconfig/scripts/linux/other/share_smb +0 -1
  296. machineconfig/scripts/linux/other/switch_ip +0 -20
  297. machineconfig/scripts/linux/skrg +0 -4
  298. machineconfig/scripts/linux/warp-cli.sh +0 -122
  299. machineconfig/scripts/linux/z_ls +0 -104
  300. machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
  301. machineconfig/scripts/python/devops_helpers/cli_config.py +0 -81
  302. machineconfig/scripts/python/devops_helpers/cli_config_dotfile.py +0 -84
  303. machineconfig/scripts/python/devops_helpers/cli_data.py +0 -18
  304. machineconfig/scripts/python/devops_helpers/cli_nw.py +0 -73
  305. machineconfig/scripts/python/devops_helpers/cli_self.py +0 -117
  306. machineconfig/scripts/python/devops_helpers/cli_share_server.py +0 -104
  307. machineconfig/scripts/python/helper_navigator/__init__.py +0 -20
  308. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
  309. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
  310. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
  311. machineconfig/scripts/python/helpers_fire/fire_agents_helper_types.py +0 -30
  312. machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
  313. machineconfig/scripts/python/helpers_fire/template.sh +0 -15
  314. machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
  315. machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
  316. machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -66
  317. machineconfig/scripts/python/repos_helpers/action.py +0 -378
  318. machineconfig/scripts/python/repos_helpers/count_lines_frontend.py +0 -17
  319. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  320. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  321. machineconfig/scripts/windows/fzfrga.bat +0 -20
  322. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  323. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  324. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  325. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  326. machineconfig/settings/shells/pwsh/profile.ps1 +0 -0
  327. machineconfig/settings/yazi/keymap.toml +0 -0
  328. machineconfig/settings/yazi/yazi.toml +0 -4
  329. machineconfig/setup_linux/apps.sh +0 -66
  330. machineconfig/setup_linux/nix/cli_installation.sh +0 -137
  331. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  332. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  333. machineconfig/setup_windows/apps.ps1 +0 -62
  334. machineconfig/setup_windows/others/obs.ps1 +0 -4
  335. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  336. machineconfig/setup_windows/wt_and_pwsh/__init__.py +0 -0
  337. machineconfig/utils/installer_utils/installer.py +0 -225
  338. machineconfig-6.23.dist-info/METADATA +0 -84
  339. machineconfig-6.23.dist-info/RECORD +0 -428
  340. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  341. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper.py +0 -0
  342. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper_restart.py +0 -0
  343. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_manager_helper.py +0 -0
  344. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
  345. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +0 -0
  346. machineconfig/jobs/installer/{custom_dev → python_scripts}/__init__.py +0 -0
  347. machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  348. machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  349. machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  350. machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  351. machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  352. machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  353. machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  354. machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  355. machineconfig/{setup_linux/web_shortcuts → jobs/scripts/bash_scripts}/android.sh +0 -0
  356. machineconfig/jobs/{linux/msc → scripts/bash_scripts}/lid.sh +0 -0
  357. machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/mint_keyboard_shortcuts.sh +0 -0
  358. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_drive +0 -0
  359. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
  360. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_smb +0 -0
  361. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
  362. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
  363. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
  364. machineconfig/{scripts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
  365. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
  366. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
  367. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
  368. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
  369. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
  370. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
  371. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
  372. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  373. machineconfig/{jobs/python → scripts/python/ai/utils}/__init__.py +0 -0
  374. machineconfig/scripts/python/{cloud_helpers → helpers_agents}/__init__.py +0 -0
  375. machineconfig/scripts/python/{croshell_helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  376. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_search.py +0 -0
  377. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_load_balancer.py +0 -0
  378. machineconfig/scripts/python/{helpers_fire → helpers_agents/templates}/template.ps1 +0 -0
  379. machineconfig/scripts/python/{devops_helpers → helpers_cloud}/__init__.py +0 -0
  380. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_helpers.py +1 -1
  381. /machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/helpers5.py +0 -0
  382. /machineconfig/scripts/python/{devops_helpers/themes → helpers_croshell}/__init__.py +0 -0
  383. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/pomodoro.py +0 -0
  384. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/scheduler.py +0 -0
  385. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/viewer.py +0 -0
  386. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/viewer_template.py +0 -0
  387. /machineconfig/scripts/python/{helpers_fire → helpers_devops}/__init__.py +0 -0
  388. /machineconfig/scripts/python/{helpers_fire/agentic_frameworks → helpers_devops/themes}/__init__.py +0 -0
  389. /machineconfig/scripts/python/{devops_helpers → helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
  390. /machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  391. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_fire_command/f.py} +0 -0
  392. /machineconfig/scripts/python/{helper_navigator → helpers_navigator}/data_models.py +0 -0
  393. /machineconfig/scripts/python/{helper_navigator → helpers_navigator}/search_bar.py +0 -0
  394. /machineconfig/scripts/python/{helpers_repos → helpers_network}/__init__.py +0 -0
  395. /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive.py +0 -0
  396. /machineconfig/scripts/python/{nw → helpers_network}/onetimeshare.py +0 -0
  397. /machineconfig/scripts/python/{repos_helpers → helpers_repos}/update.py +0 -0
  398. /machineconfig/scripts/python/{nw → helpers_sessions}/__init__.py +0 -0
  399. /machineconfig/{scripts/python/sessions_helpers → settings/wt}/__init__.py +0 -0
  400. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  401. {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/WHEEL +0 -0
  402. {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,25 @@
1
+ """
2
+ #!/usr/bin/env -S uv run
3
+ # /// script
4
+ # requires-python = ">=3.13"
5
+ # dependencies = [
6
+ # "rich",
7
+ # "polars",
8
+ # "typer>=0.12",
9
+ # "loguru",
10
+ # "numpy",
11
+ # ]
12
+ # ///
13
+
14
+ """
15
+
16
+
17
+ def main():
18
+ """a,b,c"""
19
+ print("This is a helper function in a.py")
20
+ import numpy as np
21
+ print("Numpy version:", np.__version__)
22
+
23
+
24
+ if __name__ == "__main__":
25
+ main()
machineconfig/logger.py CHANGED
@@ -1,4 +1,3 @@
1
- from __future__ import annotations
2
1
 
3
2
  import logging
4
3
  import os
@@ -1,35 +1,73 @@
1
1
 
2
2
  from typing import Literal
3
+ from pathlib import Path
4
+ import shutil
3
5
  from machineconfig.utils.source_of_truth import LIBRARY_ROOT, CONFIG_ROOT
4
6
 
5
7
 
6
- def copy_assets_to_machine(which: Literal["scripts", "settings"]):
7
- # callers, symlink public, shell profile adder (requires init.ps1 and scripts dir to be present on machine)
8
+ def _copy_path(source: Path, target: Path, overwrite: bool) -> None:
9
+ source = source.expanduser().resolve()
10
+ target = target.expanduser().resolve()
11
+ if not source.exists():
12
+ raise FileNotFoundError(f"Source path does not exist: {source}")
13
+ target.parent.mkdir(parents=True, exist_ok=True)
14
+ if target.exists() and not overwrite:
15
+ raise FileExistsError(f"Target already exists and overwrite=False: {target}")
16
+ if target.exists() and overwrite:
17
+ if target.is_dir():
18
+ shutil.rmtree(target)
19
+ else:
20
+ target.unlink()
21
+ if source.is_file():
22
+ shutil.copy2(source, target)
23
+ elif source.is_dir():
24
+ shutil.copytree(source, target, dirs_exist_ok=overwrite)
25
+ else:
26
+ raise ValueError(f"Source is neither file nor directory: {source}")
27
+
28
+
29
+ def copy_assets_to_machine(which: Literal["scripts", "settings"]) -> None:
8
30
  import platform
9
- if platform.system().lower() == "windows":
31
+ import subprocess
32
+ system_name = platform.system().lower()
33
+ if system_name == "windows":
10
34
  system = "windows"
11
- elif platform.system().lower() == "linux" or platform.system().lower() == "darwin":
35
+ elif system_name in {"linux", "darwin"}:
12
36
  system = "linux"
13
37
  else:
14
- raise NotImplementedError(f"System {platform.system().lower()} not supported")
38
+ raise NotImplementedError(f"System {system_name} not supported")
39
+
15
40
  match which:
16
41
  case "scripts":
17
42
  source = LIBRARY_ROOT.joinpath("scripts", system)
18
- target = CONFIG_ROOT.joinpath("scripts", system)
43
+ target = CONFIG_ROOT.joinpath("scripts")
44
+
45
+ # _copy_path(source=source, target=target, overwrite=True)
19
46
 
47
+ for a_path in source.rglob("*"):
48
+ if not a_path.is_file():
49
+ continue
50
+ relative_path = a_path.relative_to(source)
51
+ target_path = target.joinpath(relative_path)
52
+ _copy_path(source=a_path, target=target_path, overwrite=True)
53
+
54
+ wrap_mcfg_source = LIBRARY_ROOT.joinpath("scripts", "nu", "wrap_mcfg.nu")
55
+ wrap_mcfg_target = CONFIG_ROOT.joinpath("scripts", "wrap_mcfg.nu")
56
+
57
+ wrap_mcfg_target.parent.mkdir(parents=True, exist_ok=True)
58
+ _copy_path(source=wrap_mcfg_source, target=wrap_mcfg_target, overwrite=True)
59
+
60
+ if system_name == "linux":
61
+ from rich.console import Console
62
+ console = Console()
63
+ console.print("\n[bold]📜 Setting executable permissions for scripts...[/bold]")
64
+ scripts_path = CONFIG_ROOT.joinpath("scripts")
65
+ subprocess.run(f"chmod +x {scripts_path} -R", shell=True, capture_output=True, text=True, check=False)
66
+ console.print("[green]✅ Script permissions updated[/green]")
67
+ return
20
68
  case "settings":
21
69
  source = LIBRARY_ROOT.joinpath("settings")
22
70
  target = CONFIG_ROOT.joinpath("settings")
23
- from machineconfig.utils.path_extended import PathExtended
24
- PathExtended(source).copy(folder=target.parent, overwrite=True)
25
- import platform
26
- system = platform.system().lower()
27
- if system == "linux" and which == "scripts":
28
- import subprocess
29
- from rich.console import Console
30
- console = Console()
31
- console.print("\n[bold]📜 Setting executable permissions for scripts...[/bold]")
32
- subprocess.run(f"chmod +x {CONFIG_ROOT.joinpath(f'scripts/{system.lower()}')} -R", shell=True, capture_output=True, text=True)
33
- console.print("[green]✅ Script permissions updated[/green]")
34
-
35
71
 
72
+ _copy_path(source=source, target=target, overwrite=True)
73
+
@@ -13,6 +13,7 @@ from rich.table import Table
13
13
 
14
14
  from machineconfig.utils.path_extended import PathExtended
15
15
  from machineconfig.utils.links import symlink_map, copy_map
16
+ from machineconfig.profile.create_links_export import ON_CONFLICT_STRICT
16
17
  from machineconfig.utils.source_of_truth import LIBRARY_ROOT, CONFIG_ROOT
17
18
 
18
19
  import platform
@@ -79,7 +80,7 @@ def read_mapper() -> MapperFileData:
79
80
 
80
81
 
81
82
  def apply_mapper(mapper_data: dict[str, list[ConfigMapper]],
82
- on_conflict: Literal["throwError", "overwriteSelfManaged", "backupSelfManaged", "overwriteDefaultPath", "backupDefaultPath"],
83
+ on_conflict: ON_CONFLICT_STRICT,
83
84
  method: Literal["symlink", "copy"]
84
85
  ):
85
86
  operation_records: list[OperationRecord] = []
@@ -1,12 +1,33 @@
1
1
 
2
2
  import typer
3
- from typing import Optional, Literal, Annotated
3
+ from typing import Optional, Literal, Annotated, TypeAlias
4
4
 
5
+ ON_CONFLICT_LOOSE: TypeAlias = Literal[
6
+ "throw-error", "t",
7
+ "overwrite-self-managed", "os",
8
+ "backup-self-managed", "bs",
9
+ "overwrite-default-path", "od",
10
+ "backup-default-path", "bd"
11
+ ]
12
+ ON_CONFLICT_STRICT: TypeAlias = Literal["throw-error", "overwrite-self-managed", "backup-self-managed", "overwrite-default-path", "backup-default-path"]
13
+ ON_CONFLICT_MAPPER: dict[str, ON_CONFLICT_STRICT] = {
14
+ "t": "throw-error",
15
+ "os": "overwrite-self-managed",
16
+ "bs": "backup-self-managed",
17
+ "od": "overwrite-default-path",
18
+ "bd": "backup-default-path",
19
+ "throw-error": "throw-error",
20
+ "overwrite-self-managed": "overwrite-self-managed",
21
+ "backup-self-managed": "backup-self-managed",
22
+ "overwrite-default-path": "overwrite-default-path",
23
+ "backup-default-path": "backup-default-path",
24
+ }
5
25
 
6
- def main_public_from_parser(method: Annotated[Literal["symlink", "copy"], typer.Option(..., help="Method to use for setting up the config file.")],
7
- on_conflict: Annotated[Literal["throwError", "overwriteDefaultPath", "backupDefaultPath"], typer.Option(..., help="Action to take on conflict")],
8
- which: Annotated[Optional[str], typer.Option(..., help="Specific items to process")] = None,
9
- interactive: Annotated[bool, typer.Option(..., help="Run in interactive mode")] = False):
26
+
27
+ def main_public_from_parser(method: Annotated[Literal["symlink", "s", "copy", "c"], typer.Option(..., "--method", "-m", help="Method to use for setting up the config file.")],
28
+ on_conflict: Annotated[ON_CONFLICT_LOOSE, typer.Option(..., "--on-conflict", "-o", help="Action to take on conflict")] = "throw-error",
29
+ which: Annotated[Optional[str], typer.Option(..., "--which", "-w", help="Specific items to process")] = "all",
30
+ interactive: Annotated[bool, typer.Option(..., "--interactive", "-i", help="Run in interactive mode")] = False):
10
31
  """Terminology:
11
32
  SOURCE = Self-Managed-Config-File-Path
12
33
  TARGET = Config-File-Default-Path
@@ -16,7 +37,7 @@ def main_public_from_parser(method: Annotated[Literal["symlink", "copy"], typer.
16
37
  if which is None:
17
38
  assert interactive is True
18
39
  from machineconfig.utils.options import choose_from_options
19
- items_chosen = choose_from_options(msg="Which symlink to create?", options=list(mapper_full.keys()), fzf=True, multi=True)
40
+ items_chosen = choose_from_options(msg="Which symlink to create?", options=list(mapper_full.keys()), tv=True, multi=True)
20
41
  else:
21
42
  assert interactive is False
22
43
  if which == "all":
@@ -24,31 +45,56 @@ def main_public_from_parser(method: Annotated[Literal["symlink", "copy"], typer.
24
45
  else:
25
46
  items_chosen = which.split(",")
26
47
  items_objections: dict[str, list[ConfigMapper]] = {item: mapper_full[item] for item in items_chosen if item in mapper_full}
27
-
48
+ if len(items_objections) == 0:
49
+ typer.echo("[red]Error:[/] No valid items selected.")
50
+ typer.Exit(code=1)
51
+ return
28
52
  from machineconfig.profile.create_links import apply_mapper
29
53
  from machineconfig.profile.create_helper import copy_assets_to_machine
30
54
  copy_assets_to_machine(which="settings") # config files live here and will be linked to.
31
- apply_mapper(mapper_data=items_objections, on_conflict=on_conflict, method=method)
55
+ method_map: dict[str, Literal["symlink", "copy"]] = {
56
+ "s": "symlink",
57
+ "symlink": "symlink",
58
+ "c": "copy",
59
+ "copy": "copy",
60
+ }
61
+ method = method_map[method]
62
+ apply_mapper(mapper_data=items_objections, on_conflict=ON_CONFLICT_MAPPER[on_conflict], method=method)
32
63
 
33
64
 
34
- def main_private_from_parser(method: Annotated[Literal["symlink", "copy"], typer.Option(..., help="Method to use for linking files")],
35
- on_conflict: Annotated[Literal["throwError", "overwriteSelfManaged", "backupSelfManaged", "overwriteDefaultPath", "backupDefaultPath"], typer.Option(..., help="Action to take on conflict")] = "throwError",
36
- which: Annotated[Optional[str], typer.Option(..., help="Specific items to process")] = None,
37
- interactive: Annotated[bool, typer.Option(..., help="Run in interactive mode")] = False):
65
+ def main_private_from_parser(method: Annotated[Literal["symlink", "s", "copy", "c"], typer.Option(..., "--method", "-m", help="Method to use for linking files")],
66
+ on_conflict: Annotated[ON_CONFLICT_LOOSE, typer.Option(..., "--on-conflict", "-o", help="Action to take on conflict")] = "throw-error",
67
+ which: Annotated[Optional[str], typer.Option(..., "--which", "-w", help="Specific items to process")] = "all",
68
+ interactive: Annotated[bool, typer.Option(..., "--interactive", "-i", help="Run in interactive mode")] = False):
38
69
  from machineconfig.profile.create_links import ConfigMapper, read_mapper
39
-
40
70
  mapper_full = read_mapper()["private"]
41
71
  if which is None:
42
- assert interactive is True
72
+ if interactive is False:
73
+ typer.echo("[red]Error:[/] --which must be provided when not running in interactive mode.")
74
+ typer.Exit(code=1)
75
+ return
43
76
  from machineconfig.utils.options import choose_from_options
44
- items_chosen = choose_from_options(msg="Which symlink to create?", options=list(mapper_full.keys()), fzf=True, multi=True)
77
+ items_chosen = choose_from_options(msg="Which symlink to create?", options=list(mapper_full.keys()), tv=True, multi=True)
45
78
  else:
46
- assert interactive is False
79
+ if interactive is True:
80
+ typer.echo("[yellow]Warning:[/] --which is provided, but its not allowed to be used together with --interactive. Ignoring --interactive flag.")
81
+ typer.Exit(code=0)
82
+ return
47
83
  if which == "all":
48
84
  items_chosen = list(mapper_full.keys())
49
85
  else:
50
86
  items_chosen = which.split(",")
51
87
  items_objections: dict[str, list[ConfigMapper]] = {item: mapper_full[item] for item in items_chosen if item in mapper_full}
52
-
88
+ if len(items_objections) == 0:
89
+ typer.echo("[red]Error:[/] No valid items selected.")
90
+ typer.Exit(code=1)
91
+ return
53
92
  from machineconfig.profile.create_links import apply_mapper
54
- apply_mapper(mapper_data=items_objections, on_conflict=on_conflict, method=method)
93
+ method_map: dict[str, Literal["symlink", "copy"]] = {
94
+ "s": "symlink",
95
+ "symlink": "symlink",
96
+ "c": "copy",
97
+ "copy": "copy",
98
+ }
99
+ method = method_map[method]
100
+ apply_mapper(mapper_data=items_objections, on_conflict=ON_CONFLICT_MAPPER[on_conflict], method=method)
@@ -1,42 +1,63 @@
1
1
  """shell"""
2
2
 
3
- from machineconfig.utils.path_extended import PathExtended
4
- from machineconfig.utils.source_of_truth import CONFIG_ROOT
3
+ from pathlib import Path
5
4
 
6
- import platform
7
- import os
8
- import subprocess
9
- from rich.console import Console
10
- from rich.panel import Panel
11
5
 
12
6
 
13
- system = platform.system()
14
- sep = ";" if system == "Windows" else ":" # PATH separator, this is special for PATH object, not to be confused with PathExtended.sep (normal paths), usually / or \
15
- PATH = os.environ["PATH"].split(sep)
16
- console = Console()
17
- BOX_WIDTH = 100 # Define BOX_WIDTH or get it from a config
18
-
19
-
20
- def get_shell_profile_path() -> PathExtended:
7
+ def get_shell_profile_path() -> Path:
8
+ import platform
9
+ import subprocess
10
+ from rich.console import Console
11
+ from rich.panel import Panel
12
+ system = platform.system()
13
+ console = Console()
21
14
  if system == "Windows":
22
15
  result = subprocess.run(["pwsh", "-Command", "$PROFILE"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, check=False)
23
16
  if result.returncode == 0 and result.stdout.strip():
24
- profile_path = PathExtended(result.stdout.strip())
17
+ profile_path = Path(result.stdout.strip())
25
18
  else:
26
19
  print(f"Command failed with return code {result.returncode}")
27
20
  print(f"stdout: {result.stdout}")
28
21
  print(f"stderr: {result.stderr}")
29
22
  raise ValueError(f"""Could not get profile path for Windows. Got stdout: {result.stdout}, stderr: {result.stderr}""")
30
23
  elif system == "Linux":
31
- profile_path = PathExtended("~/.bashrc").expanduser()
24
+ profile_path = Path.home().joinpath(".bashrc")
25
+ elif system == "Darwin":
26
+ profile_path = Path.home().joinpath(".zshrc")
32
27
  else:
33
28
  raise ValueError(f"""Not implemented for this system {system}""")
34
29
  console.print(Panel(f"""🐚 SHELL PROFILE | Working with path: `{profile_path}`""", title="[bold blue]Shell Profile[/bold blue]", border_style="blue"))
35
30
  return profile_path
36
31
 
37
32
 
33
+ def get_nu_shell_profile_path() -> Path:
34
+ import platform
35
+ from rich.console import Console
36
+ from rich.panel import Panel
37
+ system = platform.system()
38
+ console = Console()
39
+ if system == "Windows":
40
+ profile_path = Path.home().joinpath(r"AppData\Roaming\nushell")
41
+ elif system == "Linux":
42
+ profile_path = Path.home().joinpath(".config/nushell")
43
+ elif system == "Darwin":
44
+ profile_path = Path.home().joinpath("Library/Application Support/nushell")
45
+ else:
46
+ raise ValueError(f"""Not implemented for this system {system}""")
47
+ console.print(Panel(f"""🐚 NU SHELL PROFILE | Working with path: `{profile_path}`""", title="[bold cyan]Nu Shell Profile[/bold cyan]", border_style="cyan"))
48
+ return profile_path
49
+
50
+
38
51
  def create_default_shell_profile() -> None:
39
52
  shell_profile_path = get_shell_profile_path()
53
+ import platform
54
+ import subprocess
55
+ from rich.console import Console
56
+ from rich.panel import Panel
57
+ from machineconfig.utils.source_of_truth import CONFIG_ROOT
58
+ from machineconfig.utils.path_extended import PathExtended
59
+ system = platform.system()
60
+ console = Console()
40
61
  if not shell_profile_path.exists():
41
62
  console.print(Panel(f"""🆕 PROFILE | Profile does not exist at `{shell_profile_path}`. Creating a new one.""", title="[bold blue]Profile[/bold blue]", border_style="blue"))
42
63
  shell_profile_path.parent.mkdir(parents=True, exist_ok=True)
@@ -45,26 +66,42 @@ def create_default_shell_profile() -> None:
45
66
  from machineconfig.profile.create_helper import copy_assets_to_machine
46
67
  copy_assets_to_machine("settings") # init.ps1 or init.sh live here
47
68
  copy_assets_to_machine("scripts") # init scripts are going to reference those scripts.
69
+ shell_name = ""
48
70
  if system == "Windows":
71
+ shell_name = "pwsh"
49
72
  init_script = PathExtended(CONFIG_ROOT).joinpath("settings/shells/pwsh/init.ps1")
50
73
  source_line = f""". {str(init_script.collapseuser(placeholder="$HOME"))}"""
51
- else:
74
+ elif system == "Linux":
75
+ shell_name = "bash"
52
76
  init_script = PathExtended(CONFIG_ROOT).joinpath("settings/shells/bash/init.sh")
53
77
  source_line = f"""source {str(init_script.collapseuser(placeholder="$HOME"))}"""
78
+ elif system == "Darwin":
79
+ shell_name = "zsh"
80
+ init_script = PathExtended(CONFIG_ROOT).joinpath("settings/shells/zsh/init.sh")
81
+ source_line = f"""source {str(init_script.collapseuser(placeholder="$HOME"))}"""
82
+ else:
83
+ raise ValueError(f"""Not implemented for this system {system}""")
54
84
 
55
85
  was_shell_updated = False
56
86
  if source_line in shell_profile:
57
- console.print(Panel("🔄 PROFILE | Skipping init script sourcing - already present in profile", title="[bold blue]Profile[/bold blue]", border_style="blue"))
87
+ console.print(Panel("🔄 PROFILE | Skipping init script sourcing - already present in profile", title="[bold blue]Profile[/bold blue]", border_style="blue"))
58
88
  else:
59
89
  console.print(Panel("📝 PROFILE | Adding init script sourcing to profile", title="[bold blue]Profile[/bold blue]", border_style="blue"))
60
90
  shell_profile += "\n" + source_line + "\n"
61
- if system == "Linux":
91
+ if shell_name == "bash":
62
92
  result = subprocess.run(["cat", "/proc/version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, check=False)
63
93
  if result.returncode == 0 and result.stdout:
64
94
  version_info = result.stdout.lower()
65
- if "microsoft" in version_info or "wsl" in version_info:
95
+ is_wsl = "microsoft" in version_info or "wsl" in version_info
96
+ if is_wsl:
66
97
  shell_profile += "\ncd $HOME"
67
98
  console.print("📌 WSL detected - adding 'cd $HOME' to profile to avoid Windows filesystem")
99
+ # Sync shell history between Windows and WSL
100
+ # https://www.hanselman.com/blog/sharing-powershell-history-between-windows-and-wsl
101
+ shell_profile += """
102
+ # Sync shell history between Windows and WSL
103
+ export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\\n'}history -a; history -c; history -r"
104
+ """
68
105
  was_shell_updated = True
69
106
  if was_shell_updated:
70
107
  shell_profile_path.parent.mkdir(parents=True, exist_ok=True)
@@ -72,117 +109,38 @@ def create_default_shell_profile() -> None:
72
109
  console.print(Panel("✅ Profile updated successfully", title="[bold blue]Profile[/bold blue]", border_style="blue"))
73
110
 
74
111
 
75
- # def append_temporarily(dirs: list[str], kind: Literal["append", "prefix", "replace"]) -> str:
76
- # dirs_ = []
77
- # for path in dirs:
78
- # path_rel = PathExtended(path).collapseuser(strict=False)
79
- # if path_rel.as_posix() in PATH or str(path_rel) in PATH or str(path_rel.expanduser()) in PATH or path_rel.expanduser().as_posix() in PATH:
80
- # print(f"Path passed `{path}` is already in PATH, skipping the appending.")
81
- # else:
82
- # dirs_.append(path_rel.as_posix() if system == "Linux" else str(path_rel))
83
- # dirs = dirs_
84
- # if len(dirs) == 0:
85
- # return ""
86
-
87
- # if system == "Windows":
88
- # """Source: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-7.2"""
89
- # if kind == "append":
90
- # command = rf'$env:Path += ";{sep.join(dirs)}"' # Append to the Path variable in the current window:
91
- # elif kind == "prefix":
92
- # command = rf'$env:Path = "{sep.join(dirs)};" + $env:Path' # Prefix the Path variable in the current window:
93
- # elif kind == "replace":
94
- # command = rf'$env:Path = "{sep.join(dirs)}"' # Replace the Path variable in the current window (use with caution!):
95
- # else:
96
- # raise KeyError
97
- # return command # if run is False else tm.run(command, shell="powershell")
98
- # elif system in ["Linux", "Darwin"]:
99
- # result = f'export PATH="{sep.join(dirs)}:$PATH"'
100
- # else:
101
- # raise ValueError
102
- # return result
103
-
104
-
105
- # def main_add_sources_to_shell_profile(profile_path: Optional[str], choice: Optional[str]) -> None:
106
- # sources: list[str] = read_toml(LIBRARY_ROOT.joinpath("profile/sources.toml"))[system.lower()]["files"]
107
- # console.print(Panel("🔄 Adding sources to shell profile", title="[bold blue]Sources[/bold blue]", border_style="blue"))
108
-
109
- # if choice is None:
110
- # choice_obj = choose_from_options(msg="Which patch to add?", options=sources + ["all", "none(EXIT)"], default="none(EXIT)", multi=True)
111
- # if isinstance(choice_obj, str):
112
- # if choice_obj == "all":
113
- # choice = choice_obj
114
- # elif choice_obj == "none(EXIT)":
115
- # return
116
- # else:
117
- # sources = [choice_obj]
118
- # else: # isinstance(choice_obj, list):
119
- # sources = choice_obj
120
- # elif choice == "none(EXIT)":
121
- # return
122
-
123
- # if isinstance(profile_path, str):
124
- # profile_path_obj = PathExtended(profile_path)
125
- # else:
126
- # profile_path_obj = get_shell_profile_path()
127
- # profile = profile_path_obj.read_text(encoding="utf-8")
128
-
129
- # for a_file in sources:
130
- # tmp = a_file.replace("REPO_ROOT", REPO_ROOT.as_posix()).replace("LIBRARY_ROOT", LIBRARY_ROOT.as_posix())
131
- # file = PathExtended(tmp).collapseuser() # this makes the shell profile interuseable across machines.
132
- # file = file.as_posix() if system == "Linux" else str(file)
133
- # if file not in profile:
134
- # if system == "Windows":
135
- # profile += f"\n. {file}"
136
- # console.print(f"➕ Added PowerShell source: {file}")
137
- # elif system == "Linux":
138
- # profile += f"\nsource {file}"
139
- # console.print(f"➕ Added Bash source: {file}")
140
- # else:
141
- # raise ValueError(f"Not implemented for this system {system}")
142
- # else:
143
- # console.print(f"⏭️ Source already present: {file}")
144
-
145
- # profile_path_obj.write_text(profile, encoding="utf-8")
146
- # console.print(Panel("✅ Shell profile updated with sources", title="[bold blue]Sources[/bold blue]", border_style="blue"))
147
-
148
-
149
- # def main_add_patches_to_shell_profile(profile_path: Optional[str], choice: Optional[str]) -> None:
150
- # patches: list[str] = [item.as_posix() for item in PathExtended(LIBRARY_ROOT).joinpath(f"profile/patches/{system.lower()}").search()]
151
-
152
- # console.print(Panel("🩹 Adding patches to shell profile", title="[bold blue]Patches[/bold blue]", border_style="blue"))
153
-
154
- # if choice is None:
155
- # choice_chosen = choose_from_options(msg="Which patch to add?", options=list(patches) + ["all", "none(EXIT)"], default="none(EXIT)", multi=False)
156
- # assert isinstance(choice_chosen, str), f"Choice must be a string or a list of strings, not {type(choice)}"
157
- # choice = choice_chosen
158
- # if choice == "none(EXIT)":
159
- # return None
160
- # elif str(choice) == "all":
161
- # console.print("📌 Adding all patches to profile")
162
- # else:
163
- # patches = [choice]
164
- # console.print(f"📌 Adding selected patch: {choice}")
165
-
166
- # profile_path_obj = PathExtended(profile_path) if isinstance(profile_path, str) else get_shell_profile_path()
167
- # profile = profile_path_obj.read_text(encoding="utf-8")
168
-
169
- # for patch_path in patches:
170
- # patch_path_obj = PathExtended(patch_path)
171
- # patch = patch_path_obj.read_text(encoding="utf-8")
172
- # if patch in profile:
173
- # console.print(f"⏭️ Patch already present: {patch_path_obj.name}")
174
- # else:
175
- # profile += "\n" + patch
176
- # console.print(f"➕ Added patch: {patch_path_obj.name}")
177
-
178
- # if system == "Linux":
179
- # res = Terminal().run("cat /proc/version").op
180
- # if "microsoft" in res.lower() or "wsl" in res.lower():
181
- # profile += "\ncd ~" # this is to make sure that the current dir is not in the windows file system, which is terribly slow and its a bad idea to be there anyway.
182
- # console.print("📌 WSL detected - adding 'cd ~' to profile to avoid Windows filesystem")
183
-
184
- # profile_path_obj.write_text(profile, encoding="utf-8")
185
- # console.print(Panel("✅ Shell profile updated with patches", title="[bold blue]Patches[/bold blue]", border_style="blue"))
112
+ def create_nu_shell_profile() -> None:
113
+ from rich.console import Console
114
+ from rich.panel import Panel
115
+ from machineconfig.utils.source_of_truth import CONFIG_ROOT
116
+ from machineconfig.utils.path_extended import PathExtended
117
+ console = Console()
118
+ nu_profile_path = get_nu_shell_profile_path()
119
+ config_dir = nu_profile_path
120
+ config_file = config_dir.joinpath("config.nu")
121
+ if not config_dir.exists():
122
+ console.print(Panel(f"""🆕 NU SHELL CONFIG | Config directory does not exist at `{config_dir}`. Creating a new one.""", title="[bold cyan]Nu Shell Config[/bold cyan]", border_style="cyan"))
123
+ config_dir.mkdir(parents=True, exist_ok=True)
124
+ if not config_file.exists():
125
+ console.print(Panel(f"""🆕 NU SHELL CONFIG | config.nu file does not exist at `{config_file}`. Creating a new one.""", title="[bold cyan]Nu Shell Config[/bold cyan]", border_style="cyan"))
126
+ config_file.write_text("", encoding="utf-8")
127
+ config_content = config_file.read_text(encoding="utf-8")
128
+ from machineconfig.profile.create_helper import copy_assets_to_machine
129
+ copy_assets_to_machine("settings")
130
+ copy_assets_to_machine("scripts")
131
+ init_script = PathExtended(CONFIG_ROOT).joinpath("settings/shells/nushell/init.nu")
132
+ source_line = f"""use {str(init_script)}"""
133
+ was_config_updated = False
134
+ if source_line in config_content:
135
+ console.print(Panel("🔄 NU SHELL CONFIG | Skipping init script sourcing - already present in config.nu", title="[bold cyan]Nu Shell Config[/bold cyan]", border_style="cyan"))
136
+ else:
137
+ console.print(Panel("📝 NU SHELL CONFIG | Adding init script sourcing to config.nu", title="[bold cyan]Nu Shell Config[/bold cyan]", border_style="cyan"))
138
+ config_content += "\n" + source_line + "\n"
139
+ was_config_updated = True
140
+ if was_config_updated:
141
+ config_dir.mkdir(parents=True, exist_ok=True)
142
+ config_file.write_text(config_content, encoding="utf-8")
143
+ console.print(Panel("✅ Nu shell config updated successfully", title="[bold cyan]Nu Shell Config[/bold cyan]", border_style="cyan"))
186
144
 
187
145
 
188
146
  if __name__ == "__main__":
@@ -33,9 +33,6 @@ config2 = {this = '~/.cli-m365-all-connections.json', to_this = '~/dotfiles/cred
33
33
  config3 = {this = '~/.cli-m365-connection.json', to_this = '~/dotfiles/creds/tokens/.cli-m365-connection.json'}
34
34
  # config2 = {this = '~/.cli-m365-tokens.json', to_this = '~/dotfiles/creds/tokens/.cli-m365-tokens.json'}
35
35
 
36
- # [bash_linux]
37
- # bashrc = {this = '~/.inputrc', to_this = '~/dotfiles/shells/bash/.inputrc'}
38
-
39
36
  [remmina]
40
37
  data = {this = '~/.var/app/org.remmina.Remmina/data/remmina', to_this = '~/dotfiles/creds/RDP/remmina/data/remmina'}
41
38
 
@@ -76,6 +73,9 @@ config = {this = '~/.docker/config.json', to_this = '~/dotfiles/creds/docker/con
76
73
 
77
74
  # =========================== PUBLIC ======================================
78
75
 
76
+ [marimo]
77
+ config = {this = '~/.config/marimo/marimo.toml', to_this = 'CONFIG_ROOT/settings/marimo/marimo.toml'}
78
+
79
79
  [presenterm]
80
80
  config = {this = '~/.config/presenterm/config.yaml', to_this = 'CONFIG_ROOT/settings/presenterm/config.yaml'}
81
81
 
@@ -94,14 +94,23 @@ config_again = {this = '~/.config/procs/config.toml', to_this = 'CONFIG_ROOT/set
94
94
  config = {this = '~/.config/rofi/config.rasi', to_this = 'CONFIG_ROOT/settings/rofi/config.rasi'}
95
95
 
96
96
  [yazi_windows]
97
- yazi = {this = '~/AppData/Roaming/yazi/config/yazi.toml', to_this = 'CONFIG_ROOT/settings/yazi/yazi.toml'}
98
- keymap = {this = '~/AppData/Roaming/yazi/config/keymap.toml', to_this = 'CONFIG_ROOT/settings/yazi/keymap.toml'}
97
+ yazi = {this = '~/AppData/Roaming/yazi/config/yazi.toml', to_this = 'CONFIG_ROOT/settings/yazi/yazi_windows.toml'}
98
+ keymap = {this = '~/AppData/Roaming/yazi/config/keymap.toml', to_this = 'CONFIG_ROOT/settings/yazi/keymap_windows.toml'}
99
99
  theme = {this = '~/AppData/Roaming/yazi/config/theme.toml', to_this = 'CONFIG_ROOT/settings/yazi/theme.toml'}
100
+ init = {this = '~/AppData/Roaming/yazi/config/init.lua', to_this = 'CONFIG_ROOT/settings/yazi/init.lua'}
101
+
102
+ [television_linux]
103
+ cable = {this = '~/.config/television/cable', to_this = 'CONFIG_ROOT/settings/television/cable_unix', contents = true}
104
+
105
+ [television_windows]
106
+ cable = {this = '~/AppData/Local/television/config/cable', to_this = 'CONFIG_ROOT/settings/television/cable_windows', contents = true}
107
+
100
108
 
101
109
  [yazi_linux]
102
- yazi = {this = '~/.config/yazi/yazi.toml', to_this = 'CONFIG_ROOT/settings/yazi/yazi.toml'}
103
- keymap = {this = '~/.config/yazi/keymap.toml', to_this = 'CONFIG_ROOT/settings/yazi/keymap.toml'}
110
+ yazi = {this = '~/.config/yazi/yazi.toml', to_this = 'CONFIG_ROOT/settings/yazi/yazi_linux.toml'}
111
+ keymap = {this = '~/.config/yazi/keymap.toml', to_this = 'CONFIG_ROOT/settings/yazi/keymap_linux.toml'}
104
112
  theme = {this = '~/.config/yazi/theme.toml', to_this = 'CONFIG_ROOT/settings/yazi/theme.toml'}
113
+ init = {this = '~/.config/yazi/init.lua', to_this = 'CONFIG_ROOT/settings/yazi/init.lua'}
105
114
 
106
115
  [lf_windows]
107
116
  config = {this = '~/AppData/Local/lf/lfrc', to_this = 'CONFIG_ROOT/settings/lf/windows/lfrc'}
@@ -159,7 +168,7 @@ config = {this = '~/.config/pudb/pudb.cfg', to_this = 'CONFIG_ROOT/settings/pudb
159
168
  # AllUsersCurrentHost = {this = 'C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1', to_this = '~/dotfiles/shells/powershell/AllUsersCurrentHost/Microsoft.PowerShell_profile.ps1'}
160
169
  # AllUsersAllHosts = {this = 'C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1', to_this = '~/dotfiles/shells/windows_powershell/AllUsersAllHosts/profile.ps1'}
161
170
 
162
- [pwsh_windows]
171
+ # [pwsh_windows]
163
172
  # CurrentUserCurrentHost = {this = '~/Documents/PowerShell/Microsoft.PowerShell_profile.ps1', to_this = 'CONFIG_ROOT/settings/shells/pwsh/init.ps1'}
164
173
  # CurrentUserAllHosts = {this = '~/Documents/PowerShell/profile.ps1', to_this = 'CONFIG_ROOT/settings/shells/pwsh/profile.ps1'}
165
174
  # AllUsersCurrentHost = {this = 'C:\Program Files\PowerShell\7\Microsoft.PowerShell_profile.ps1', to_this = 'CONFIG_ROOT/settings/shells/pwsh/init.ps1'}
@@ -222,6 +231,7 @@ config = { this = '~/AppData/Roaming/helix/config.toml', to_this = 'CONFIG_ROOT/
222
231
  [helix_linux]
223
232
  languages = { this = '~/.config/helix/languages.toml', to_this = 'CONFIG_ROOT/settings/helix/languages.toml' }
224
233
  config = { this = '~/.config/helix/config.toml', to_this = 'CONFIG_ROOT/settings/helix/config.toml' }
234
+ yazi_picker = { this = '~/.config/helix/yazi-picker.sh', to_this = 'CONFIG_ROOT/settings/helix/yazi-picker.sh' }
225
235
 
226
236
  [lvim_windows]
227
237
  config = { this = '~/AppData/Local/lvim/config.lua', to_this = 'CONFIG_ROOT/settings/lvim/windows/config.lua' }
@@ -1,4 +0,0 @@
1
- version = "0.5"
2
- release_notes = """
3
- created toml file for symlinks
4
- """