machineconfig 6.82__py3-none-any.whl → 7.98__py3-none-any.whl

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