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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) hide show
  1. machineconfig/cluster/remote/run_cluster.py +1 -1
  2. machineconfig/cluster/remote/run_remote.py +1 -1
  3. machineconfig/cluster/sessions_managers/utils/maker.py +10 -8
  4. machineconfig/cluster/sessions_managers/wt_local.py +1 -1
  5. machineconfig/cluster/sessions_managers/wt_local_manager.py +1 -1
  6. machineconfig/cluster/sessions_managers/zellij_local.py +1 -1
  7. machineconfig/cluster/sessions_managers/zellij_local_manager.py +1 -1
  8. machineconfig/jobs/installer/checks/check_installations.py +133 -0
  9. machineconfig/jobs/installer/checks/install_utils.py +132 -0
  10. machineconfig/jobs/installer/checks/report_utils.py +39 -0
  11. machineconfig/jobs/installer/checks/vt_utils.py +89 -0
  12. machineconfig/jobs/installer/installer_data.json +271 -152
  13. machineconfig/jobs/installer/linux_scripts/docker.sh +6 -9
  14. machineconfig/jobs/installer/package_groups.py +11 -9
  15. machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +1 -2
  16. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +1 -1
  17. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +10 -8
  18. machineconfig/jobs/installer/{custom → python_scripts}/hx.py +30 -13
  19. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +1 -1
  20. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +6 -5
  21. machineconfig/jobs/installer/{custom_dev → python_scripts}/sysabc.py +28 -43
  22. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +1 -1
  23. machineconfig/jobs/installer/{custom → python_scripts}/yazi.py +39 -19
  24. machineconfig/jobs/scripts/powershell_scripts/cmatrix.ps1 +52 -0
  25. machineconfig/jobs/scripts_dynamic/a.py +428 -0
  26. machineconfig/logger.py +1 -1
  27. machineconfig/profile/create_helper.py +21 -10
  28. machineconfig/profile/create_links.py +77 -20
  29. machineconfig/profile/create_links_export.py +63 -58
  30. machineconfig/profile/create_shell_profile.py +14 -0
  31. machineconfig/profile/mapper_data.toml +45 -0
  32. machineconfig/profile/mapper_dotfiles.toml +249 -0
  33. machineconfig/scripts/python/agents.py +76 -171
  34. machineconfig/scripts/python/ai/initai.py +3 -1
  35. machineconfig/scripts/python/ai/scripts/__init__.py +1 -0
  36. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +2 -0
  37. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +8 -6
  38. machineconfig/scripts/python/ai/solutions/claude/claude.py +1 -1
  39. machineconfig/scripts/python/ai/solutions/cline/cline.py +1 -1
  40. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +1 -1
  41. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +29 -0
  42. machineconfig/scripts/python/ai/solutions/crush/crush.py +1 -1
  43. machineconfig/scripts/python/ai/solutions/cursor/cursors.py +1 -1
  44. machineconfig/scripts/python/ai/solutions/gemini/gemini.py +1 -1
  45. machineconfig/scripts/python/ai/solutions/gemini/settings.json +3 -0
  46. machineconfig/scripts/python/ai/{solutions → utils}/generic.py +2 -15
  47. machineconfig/scripts/python/ai/utils/vscode_tasks.py +6 -3
  48. machineconfig/scripts/python/cloud.py +58 -11
  49. machineconfig/scripts/python/croshell.py +4 -155
  50. machineconfig/scripts/python/devops.py +57 -38
  51. machineconfig/scripts/python/devops_navigator.py +17 -3
  52. machineconfig/scripts/python/fire_jobs.py +10 -193
  53. machineconfig/scripts/python/ftpx.py +5 -224
  54. machineconfig/scripts/python/graph/cli_graph.json +8743 -0
  55. machineconfig/scripts/python/{env_manager → helper_env}/path_manager_tui.py +2 -2
  56. machineconfig/scripts/python/{env_manager → helpers/helper_env}/env_manager_tui.py +1 -1
  57. machineconfig/scripts/python/helpers/helper_env/path_manager_tui.py +228 -0
  58. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.py +1 -1
  59. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_cursor_agents.py +1 -1
  60. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_gemini.py +1 -1
  61. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_qwen.py +1 -1
  62. machineconfig/scripts/python/helpers/helpers_agents/agents_impl.py +168 -0
  63. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_launch.py +10 -7
  64. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  65. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  66. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  67. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/crush/crush.json +10 -0
  68. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  69. machineconfig/scripts/python/helpers/helpers_agents/privacy/privacy.py +109 -0
  70. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.sh +3 -1
  71. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_copy.py +6 -6
  72. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_mount.py +10 -5
  73. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_sync.py +4 -4
  74. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers2.py +1 -1
  75. machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +229 -0
  76. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/scheduler.py +4 -4
  77. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/start_slidev.py +7 -6
  78. machineconfig/scripts/python/helpers/helpers_devops/backup_config.py +149 -0
  79. machineconfig/scripts/python/helpers/helpers_devops/cli_backup_retrieve.py +262 -0
  80. machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +130 -0
  81. machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
  82. machineconfig/scripts/python/helpers/helpers_devops/cli_config_mount.py +77 -0
  83. machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +71 -0
  84. machineconfig/scripts/python/helpers/helpers_devops/cli_nw.py +285 -0
  85. machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +274 -0
  86. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_self.py +84 -33
  87. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_file.py +44 -30
  88. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_server.py +26 -43
  89. machineconfig/scripts/python/helpers/helpers_devops/cli_share_temp.py +69 -0
  90. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_terminal.py +12 -6
  91. machineconfig/scripts/python/helpers/helpers_devops/cli_ssh.py +167 -0
  92. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_status.py +12 -6
  93. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_update_repos.py +1 -1
  94. machineconfig/scripts/python/{interactive.py → helpers/helpers_devops/interactive.py} +64 -50
  95. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/commands.py +25 -0
  96. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/device_entry.py +17 -0
  97. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/devices.py +17 -0
  98. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/linux.py +103 -0
  99. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/macos.py +100 -0
  100. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/selection.py +47 -0
  101. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/utils.py +28 -0
  102. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/windows.py +91 -0
  103. machineconfig/scripts/python/helpers/helpers_devops/run_script.py +197 -0
  104. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.ps1 +41 -0
  105. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.sh +48 -0
  106. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_wezterm_theme.py +3 -3
  107. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/file_wrangler.py +1 -0
  108. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_args_helper.py +1 -0
  109. machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_impl.py +233 -0
  110. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_route_helper.py +3 -3
  111. machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  112. machineconfig/scripts/python/helpers/helpers_msearch/msearch_impl.py +248 -0
  113. machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_linux/fzfg +4 -3
  114. machineconfig/scripts/python/helpers/helpers_msearch/scripts_linux/search_with_context.sh +48 -0
  115. machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_windows/fzfg.ps1 +2 -7
  116. machineconfig/scripts/python/helpers/helpers_navigator/__init__.py +20 -0
  117. machineconfig/scripts/python/helpers/helpers_navigator/cli_graph_loader.py +234 -0
  118. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/command_builder.py +61 -13
  119. machineconfig/scripts/python/helpers/helpers_navigator/command_detail.py +153 -0
  120. machineconfig/scripts/python/helpers/helpers_navigator/command_tree.py +45 -0
  121. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/data_models.py +18 -11
  122. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/main_app.py +5 -5
  123. machineconfig/scripts/python/helpers/helpers_network/__init__.py +0 -0
  124. machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/address.py +52 -10
  125. machineconfig/scripts/python/helpers/helpers_network/address_switch.py +78 -0
  126. machineconfig/scripts/python/helpers/helpers_network/ftpx_impl.py +276 -0
  127. machineconfig/scripts/python/helpers/helpers_network/ssh/__init__.py +0 -0
  128. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_identity.py +73 -0
  129. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_key_windows.py +23 -0
  130. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_ssh_key.py +169 -0
  131. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_cloud_init.py +33 -0
  132. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_linux.py +338 -0
  133. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_linux_utils.py +35 -0
  134. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_windows.py +245 -0
  135. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_windows_utils.py +34 -0
  136. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action.py +3 -3
  137. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action_helper.py +3 -3
  138. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/cloud_repo_sync.py +120 -37
  139. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/grource.py +3 -2
  140. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/record.py +33 -13
  141. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_2.py +63 -19
  142. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/update.py +0 -6
  143. machineconfig/scripts/python/helpers/helpers_search/script_help.py +81 -0
  144. machineconfig/scripts/python/helpers/helpers_sessions/__init__.py +0 -0
  145. machineconfig/scripts/python/helpers/helpers_sessions/attach_impl.py +87 -0
  146. machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +114 -0
  147. machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +1 -2
  148. machineconfig/scripts/python/helpers/helpers_sessions/utils.py +69 -0
  149. machineconfig/scripts/python/{helpers_utils → helpers/helpers_utils}/download.py +1 -1
  150. machineconfig/scripts/python/{helpers_devops/cli_utils.py → helpers/helpers_utils/pdf.py} +2 -2
  151. machineconfig/scripts/python/{helpers_utils/path.py → helpers/helpers_utils/python.py} +65 -40
  152. machineconfig/scripts/python/helpers/helpers_utils/specs.py +246 -0
  153. machineconfig/scripts/python/mcfg_entry.py +126 -48
  154. machineconfig/scripts/python/msearch.py +16 -61
  155. machineconfig/scripts/python/sessions.py +137 -191
  156. machineconfig/scripts/python/utils.py +104 -24
  157. machineconfig/settings/atuin/config.toml +294 -0
  158. machineconfig/settings/atuin/themes/catppuccin-mocha-mauve.toml +12 -0
  159. machineconfig/settings/linters/.ruff.toml +2 -1
  160. machineconfig/settings/mprocs/windows/mprocs.yaml +2 -2
  161. machineconfig/settings/shells/bash/init.sh +6 -10
  162. machineconfig/settings/shells/nushell/config.nu +23 -1
  163. machineconfig/settings/shells/nushell/env.nu +22 -48
  164. machineconfig/settings/shells/nushell/init.nu +64 -240
  165. machineconfig/settings/shells/pwsh/init.ps1 +71 -5
  166. machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
  167. machineconfig/settings/shells/wezterm/wezterm.lua +4 -0
  168. machineconfig/settings/shells/wt/settings.json +31 -37
  169. machineconfig/settings/shells/zsh/init.sh +25 -5
  170. machineconfig/settings/television/cable_unix/bash-history.toml +1 -1
  171. machineconfig/settings/television/cable_windows/pwsh-history.toml +1 -1
  172. machineconfig/settings/tv/config.toml +234 -0
  173. machineconfig/settings/tv/themes/catppuccin-mocha-sky.toml +22 -0
  174. machineconfig/settings/wsl/.wslconfig +5 -30
  175. machineconfig/settings/wt/__init__.py +0 -0
  176. machineconfig/settings/yazi/yazi_linux.toml +18 -8
  177. machineconfig/settings/zellij/__init__.py +0 -0
  178. machineconfig/settings/zellij/config.kdl +0 -295
  179. machineconfig/settings/zellij/layouts/__init__.py +0 -0
  180. machineconfig/settings/zellij/layouts/st.kdl +39 -9
  181. machineconfig/settings/zellij/layouts/st2.kdl +6 -2
  182. machineconfig/setup_linux/__init__.py +0 -1
  183. machineconfig/setup_linux/apps_desktop.sh +8 -27
  184. machineconfig/setup_linux/web_shortcuts/interactive.sh +10 -10
  185. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +3 -0
  186. machineconfig/setup_mac/__init__.py +0 -2
  187. machineconfig/setup_windows/__init__.py +2 -5
  188. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +14 -13
  189. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +4 -3
  190. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +3 -3
  191. machineconfig/type_hinting/sql/__init__.py +1 -0
  192. machineconfig/type_hinting/sql/base.py +216 -0
  193. machineconfig/type_hinting/sql/core_schema.py +64 -0
  194. machineconfig/type_hinting/sql/core_schema_typeddict.py +41 -0
  195. machineconfig/type_hinting/sql/typeddict_codegen.py +222 -0
  196. machineconfig/type_hinting/typedict/__init__.py +1 -0
  197. machineconfig/type_hinting/typedict/ast_utils.py +130 -0
  198. machineconfig/type_hinting/typedict/generator_helpers.py +319 -0
  199. machineconfig/type_hinting/typedict/generators.py +231 -0
  200. machineconfig/type_hinting/typedict/polars_schema.py +24 -0
  201. machineconfig/type_hinting/typedict/polars_schema_typeddict.py +63 -0
  202. machineconfig/utils/accessories.py +24 -0
  203. machineconfig/utils/code.py +78 -33
  204. machineconfig/utils/files/ascii_art.py +10 -14
  205. machineconfig/utils/files/headers.py +3 -5
  206. machineconfig/utils/files/read.py +8 -1
  207. machineconfig/utils/installer_utils/github_release_bulk.py +11 -91
  208. machineconfig/utils/installer_utils/github_release_scraper.py +99 -0
  209. machineconfig/utils/installer_utils/install_from_url.py +1 -1
  210. machineconfig/utils/installer_utils/installer_class.py +12 -4
  211. machineconfig/utils/installer_utils/installer_cli.py +7 -17
  212. machineconfig/utils/installer_utils/installer_helper.py +52 -36
  213. machineconfig/utils/installer_utils/installer_locator_utils.py +15 -25
  214. machineconfig/utils/installer_utils/installer_runner.py +4 -4
  215. machineconfig/utils/io.py +25 -8
  216. machineconfig/utils/meta.py +6 -4
  217. machineconfig/utils/options.py +49 -19
  218. machineconfig/utils/options_utils/__init__.py +0 -0
  219. machineconfig/utils/options_utils/options_tv_linux.py +211 -0
  220. machineconfig/utils/options_utils/options_tv_windows.py +88 -0
  221. machineconfig/utils/options_utils/tv_options.py +37 -0
  222. machineconfig/utils/path_extended.py +8 -7
  223. machineconfig/utils/procs.py +35 -27
  224. machineconfig/utils/scheduler.py +8 -2
  225. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  226. machineconfig/utils/schemas/layouts/layout_types.py +10 -0
  227. machineconfig/utils/source_of_truth.py +7 -1
  228. machineconfig/utils/ssh.py +73 -23
  229. machineconfig/utils/ssh_utils/abc.py +1 -1
  230. machineconfig/utils/ssh_utils/copy_from_here.py +19 -14
  231. machineconfig/utils/ssh_utils/copy_to_here.py +2 -1
  232. machineconfig/utils/ssh_utils/utils.py +23 -7
  233. machineconfig/utils/ssh_utils/wsl.py +107 -170
  234. machineconfig/utils/ssh_utils/wsl_helper.py +217 -0
  235. machineconfig/utils/upgrade_packages.py +4 -8
  236. {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/METADATA +30 -23
  237. machineconfig-8.61.dist-info/RECORD +539 -0
  238. {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/entry_points.txt +0 -1
  239. machineconfig/jobs/installer/check_installations.py +0 -248
  240. machineconfig/profile/backup.toml +0 -49
  241. machineconfig/profile/mapper.toml +0 -263
  242. machineconfig/scripts/linux/other/share_cloud.sh +0 -64
  243. machineconfig/scripts/linux/other/share_nfs +0 -49
  244. machineconfig/scripts/linux/other/start_docker +0 -23
  245. machineconfig/scripts/linux/other/switch_ip +0 -20
  246. machineconfig/scripts/python/helpers/run_py_script.py +0 -79
  247. machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +0 -26
  248. machineconfig/scripts/python/helpers_devops/cli_config.py +0 -105
  249. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +0 -89
  250. machineconfig/scripts/python/helpers_devops/cli_data.py +0 -25
  251. machineconfig/scripts/python/helpers_devops/cli_nw.py +0 -214
  252. machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -215
  253. machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +0 -80
  254. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +0 -3
  255. machineconfig/scripts/python/helpers_navigator/__init__.py +0 -20
  256. machineconfig/scripts/python/helpers_navigator/command_detail.py +0 -44
  257. machineconfig/scripts/python/helpers_navigator/command_tree.py +0 -620
  258. machineconfig/scripts/python/helpers_network/devops_add_identity.py +0 -82
  259. machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +0 -153
  260. machineconfig/scripts/python/helpers_network/mount_drive +0 -128
  261. machineconfig/scripts/python/helpers_network/mount_nfs +0 -49
  262. machineconfig/scripts/python/helpers_network/mount_nfs.py +0 -85
  263. machineconfig/scripts/python/helpers_network/mount_nw_drive +0 -61
  264. machineconfig/scripts/python/helpers_network/mount_nw_drive.py +0 -48
  265. machineconfig/scripts/python/helpers_network/mount_smb +0 -3
  266. machineconfig/scripts/python/helpers_network/mount_ssh.py +0 -64
  267. machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +0 -391
  268. machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +0 -338
  269. machineconfig/scripts/python/helpers_network/wsl_windows_transfer.py +0 -67
  270. machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -77
  271. machineconfig/scripts/python/terminal.py +0 -133
  272. machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +0 -92
  273. machineconfig/scripts/windows/mounts/mount_nfs.ps1 +0 -42
  274. machineconfig/scripts/windows/mounts/mount_nw.ps1 +0 -9
  275. machineconfig/scripts/windows/mounts/mount_smb.ps1 +0 -2
  276. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  277. machineconfig/scripts/windows/mounts/share_cloud.cmd +0 -34
  278. machineconfig/scripts/windows/mounts/share_smb.ps1 +0 -16
  279. machineconfig/settings/zellij/config.orig.kdl +0 -295
  280. machineconfig/setup_linux/others/android.sh +0 -2
  281. machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -30
  282. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  283. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  284. machineconfig/setup_mac/ssh/openssh_setup.sh +0 -114
  285. machineconfig/setup_windows/others/docker.ps1 +0 -7
  286. machineconfig/setup_windows/others/obs.ps1 +0 -4
  287. machineconfig/setup_windows/others/power_options.ps1 +0 -7
  288. machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -29
  289. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  290. machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -37
  291. machineconfig/setup_windows/ssh/openssh-server_add_key.ps1 +0 -7
  292. machineconfig/setup_windows/ssh/openssh-server_copy-ssh-id.ps1 +0 -14
  293. machineconfig/utils/options_tv.py +0 -119
  294. machineconfig/utils/tst.py +0 -20
  295. machineconfig-7.98.dist-info/RECORD +0 -504
  296. /machineconfig/{jobs/installer/custom_dev → cluster/sessions_managers/wt_utils/examples}/__init__.py +0 -0
  297. /machineconfig/{scripts/python/helpers_agents → jobs/installer/checks}/__init__.py +0 -0
  298. /machineconfig/{scripts/python/helpers_agents/agentic_frameworks → jobs/installer/python_scripts}/__init__.py +0 -0
  299. /machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  300. /machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  301. /machineconfig/jobs/installer/{custom_dev → python_scripts}/cloudflare_warp_cli.py +0 -0
  302. /machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  303. /machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +0 -0
  304. /machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  305. /machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  306. /machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  307. /machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  308. /machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  309. /machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +0 -0
  310. /machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
  311. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  312. /machineconfig/scripts/python/ai/{solutions/_shared.py → utils/shared.py} +0 -0
  313. /machineconfig/scripts/python/{helpers_cloud → graph}/__init__.py +0 -0
  314. /machineconfig/scripts/python/{helpers_croshell → helpers}/__init__.py +0 -0
  315. /machineconfig/scripts/python/{env_manager → helpers/helper_env}/__init__.py +0 -0
  316. /machineconfig/scripts/python/{env_manager → helpers/helper_env}/path_manager_backend.py +0 -0
  317. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_agents}/__init__.py +0 -0
  318. /machineconfig/scripts/python/{helpers_devops/themes → helpers/helpers_agents/agentic_frameworks}/__init__.py +0 -0
  319. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.json +0 -0
  320. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_search.py +0 -0
  321. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_helper_types.py +0 -0
  322. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_load_balancer.py +0 -0
  323. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/prompt.txt +0 -0
  324. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.ps1 +0 -0
  325. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_cloud}/__init__.py +0 -0
  326. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_helpers.py +0 -0
  327. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers5.py +0 -0
  328. /machineconfig/scripts/python/{helpers_network → helpers/helpers_croshell}/__init__.py +0 -0
  329. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/crosh.py +0 -0
  330. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/pomodoro.py +0 -0
  331. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer.py +0 -0
  332. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer_template.py +0 -0
  333. /machineconfig/scripts/python/{helpers_sessions → helpers/helpers_devops}/__init__.py +0 -0
  334. /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers/helpers_devops/mount_helpers}/__init__.py +0 -0
  335. /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → helpers/helpers_devops/themes/__init__.py} +0 -0
  336. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
  337. /machineconfig/scripts/python/{helpers_fire_command/f.py → helpers/helpers_fire_command/__init__.py} +0 -0
  338. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/cloud_manager.py +0 -0
  339. /machineconfig/scripts/python/{helpers_fire_command/fire_jobs_streamlit_helper.py → helpers/helpers_fire_command/f.py} +0 -0
  340. /machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/__init__.py +0 -0
  341. /machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/search_bar.py +0 -0
  342. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/onetimeshare.py +0 -0
  343. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/wifi_conn.py +0 -0
  344. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/clone.py +0 -0
  345. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_1.py +0 -0
  346. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/sync.py +0 -0
  347. /machineconfig/scripts/python/helpers/{ast_search.py → helpers_search/ast_search.py} +0 -0
  348. /machineconfig/scripts/python/helpers/{qr_code.py → helpers_search/qr_code.py} +0 -0
  349. /machineconfig/scripts/python/helpers/{repo_rag.py → helpers_search/repo_rag.py} +0 -0
  350. /machineconfig/scripts/python/helpers/{symantic_search.py → helpers_search/symantic_search.py} +0 -0
  351. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  352. {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/WHEEL +0 -0
  353. {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/top_level.txt +0 -0
@@ -2,15 +2,17 @@
2
2
  #!/bin/bash
3
3
  # set -e # Exit immediately if a command exits with a non-zero status.
4
4
 
5
+
5
6
  REPO_ROOT="$HOME/code/machineconfig"
6
7
 
7
8
  JOB_NAME="agentsTrial"
8
9
  CONTEXT_PATH="$REPO_ROOT/.ai/agents/files.md"
9
10
  PROMPT_PATH="$REPO_ROOT/.ai/agents/prompt.txt"
10
11
  AGENTS_DIR="$REPO_ROOT/.ai/agents/$JOB_NAME"
12
+ rm -rfd "$AGENTS_DIR" || true
11
13
 
12
14
  agents create \
13
- --agents crush \
15
+ --agents gemini \
14
16
  --host docker \
15
17
  --model gemini-2.5-pro \
16
18
  --provider google \
@@ -52,7 +52,7 @@ def get_securely_shared_file(url: Optional[str] = None, folder: Optional[str] =
52
52
  tmp_folder = PathExtended.tmpdir(prefix="tmp_unzip")
53
53
  try:
54
54
  res = url_obj.decrypt(pwd=pwd, inplace=True).unzip(inplace=True, folder=tmp_folder)
55
- for x in res.search("*"):
55
+ for x in res.glob("*"):
56
56
  x.move(folder=folder_obj, overwrite=True)
57
57
  finally:
58
58
  # Clean up temporary folder
@@ -79,8 +79,8 @@ def main(
79
79
  from rich.console import Console
80
80
  from rich.panel import Panel
81
81
  from machineconfig.utils.path_extended import PathExtended
82
- from machineconfig.scripts.python.helpers_cloud.helpers2 import parse_cloud_source_target
83
- from machineconfig.scripts.python.helpers_cloud.cloud_helpers import Args
82
+ from machineconfig.scripts.python.helpers.helpers_cloud.helpers2 import parse_cloud_source_target
83
+ from machineconfig.scripts.python.helpers.helpers_cloud.cloud_helpers import Args
84
84
  from machineconfig.utils.accessories import pprint
85
85
 
86
86
  console = Console()
@@ -107,7 +107,7 @@ def main(
107
107
  print("🔄 Converting Google Drive link to direct download URL")
108
108
  else:
109
109
  console.print(Panel("❌ Invalid Google Drive link format", title="[bold red]Error[/bold red]", border_style="red"))
110
- raise ValueError("Invalid Google Drive link format")
110
+ raise typer.Exit(code=1)
111
111
  return get_securely_shared_file(url=source, folder=target)
112
112
 
113
113
  if args_obj.rel2home is True and args_obj.root is None:
@@ -122,7 +122,7 @@ def main(
122
122
 
123
123
  if args_obj.key is not None:
124
124
  console.print(Panel("❌ Key-based encryption is not supported yet", title="[bold red]Error[/bold red]", border_style="red"))
125
- raise ValueError("Key-based encryption is not supported yet.")
125
+ raise typer.Exit(code=1)
126
126
 
127
127
  if cloud in source:
128
128
  console.print(Panel(f"📥 DOWNLOADING FROM CLOUD\n☁️ Cloud: {cloud}\n📂 Source: {source.replace(cloud + ':', '')}\n🎯 Target: {target}", title="[bold blue]Download[/bold blue]", border_style="blue", width=152))
@@ -159,7 +159,7 @@ def main(
159
159
  console.print(Panel(f"🔗 SHARE URL GENERATED\n📝 URL file: {share_url_path}\n🌍 {res.as_url_str()}", title="[bold blue]Share[/bold blue]", border_style="blue", width=152))
160
160
  else:
161
161
  console.print(Panel(f"❌ ERROR: Cloud '{cloud}' not found in source or target", title="[bold red]Error[/bold red]", border_style="red", width=152))
162
- raise ValueError(f"Cloud `{cloud}` not found in source or target.")
162
+ raise typer.Exit(code=1)
163
163
 
164
164
 
165
165
  def arg_parser() -> None:
@@ -19,12 +19,13 @@ def get_rclone_config():
19
19
 
20
20
  def get_mprocs_mount_txt(cloud: str, rclone_cmd: str, cloud_brand: str): # cloud_brand = config[cloud]["type"]
21
21
  from machineconfig.utils.path_extended import PathExtended
22
+ from machineconfig.utils.accessories import randstr
22
23
  import platform
23
24
  DEFAULT_MOUNT = "~/data/rclone"
24
25
 
25
26
  header = f"{' ' + cloud + ' | ' + cloud_brand + ' '}".center(50, "=")
26
27
  if platform.system() == "Windows":
27
- sub_text_path = PathExtended.tmpfile(suffix=".ps1")
28
+ sub_text_path = PathExtended("~/tmp_results/tmp_files").expanduser().joinpath(f"{randstr()}.ps1")
28
29
  sub_text_path.parent.mkdir(parents=True, exist_ok=True)
29
30
  sub_text_path.write_text(
30
31
  f"""
@@ -70,7 +71,8 @@ def mount(
70
71
  if type(res) is str:
71
72
  cloud = res
72
73
  else:
73
- raise ValueError("no cloud selected")
74
+ print(" Error: No cloud selected")
75
+ raise typer.Exit(code=1)
74
76
  print(f"🌩️ Selected cloud: {cloud}")
75
77
 
76
78
  if network is None:
@@ -97,13 +99,15 @@ def mount(
97
99
  console.print(Panel(f"{warning_line}\n{err_line}", title="Warning", border_style="yellow"))
98
100
  pass
99
101
  else:
100
- raise ValueError("unsupported platform")
102
+ print(" Error: Unsupported platform")
103
+ raise typer.Exit(code=1)
101
104
 
102
105
  elif network and platform.system() == "Windows":
103
106
  mount_loc = "X: --network-mode"
104
107
  print(f"🔌 Setting up network mount at {mount_loc}")
105
108
  else:
106
- raise ValueError("network mount only supported on windows")
109
+ print(" Error: Network mount only supported on Windows")
110
+ raise typer.Exit(code=1)
107
111
 
108
112
  mount_cmd = f"rclone mount {cloud}: {mount_loc} --vfs-cache-mode full --file-perms=0777"
109
113
  console.print(Panel(f"🚀 Preparing mount command:\n{mount_cmd}", border_style="blue"))
@@ -148,7 +152,8 @@ zellij run --in-place --cwd $HOME/data/rclone/{cloud} -- bash
148
152
  zellij action move-focus up
149
153
  """
150
154
  else:
151
- raise ValueError("unsupported platform")
155
+ print(" Error: Unsupported platform")
156
+ raise typer.Exit(code=1)
152
157
  # print(f"running command: \n{txt}")
153
158
  # PROGRAM_PATH.write_text(txt, encoding="utf-8")
154
159
  import subprocess
@@ -21,9 +21,9 @@ def main(
21
21
  verbose: Annotated[bool, typer.Option("--verbose", "-v", help="Verbosity of mprocs to show details of syncing.")] = False,
22
22
  ) -> None:
23
23
 
24
- from machineconfig.scripts.python.helpers_cloud.helpers2 import parse_cloud_source_target
25
- from machineconfig.scripts.python.helpers_cloud.cloud_helpers import Args
26
- from machineconfig.scripts.python.helpers_cloud.cloud_mount import get_mprocs_mount_txt
24
+ from machineconfig.scripts.python.helpers.helpers_cloud.helpers2 import parse_cloud_source_target
25
+ from machineconfig.scripts.python.helpers.helpers_cloud.cloud_helpers import Args
26
+ from machineconfig.scripts.python.helpers.helpers_cloud.cloud_mount import get_mprocs_mount_txt
27
27
  from rich.console import Console
28
28
  from rich.panel import Panel
29
29
  console = Console()
@@ -77,5 +77,5 @@ def main(
77
77
  # import subprocess
78
78
  # subprocess.run(txt, shell=True, check=True)
79
79
  from machineconfig.utils.code import run_shell_script
80
- run_shell_script(txt)
80
+ run_shell_script(txt, display_script=True, clean_env=False)
81
81
 
@@ -1,4 +1,4 @@
1
- from machineconfig.scripts.python.helpers_cloud.cloud_helpers import Args, ArgsDefaults, absolute, find_cloud_config, get_secure_share_cloud_config
1
+ from machineconfig.scripts.python.helpers.helpers_cloud.cloud_helpers import Args, ArgsDefaults, absolute, find_cloud_config, get_secure_share_cloud_config
2
2
  from machineconfig.utils.io import read_ini
3
3
  from machineconfig.utils.source_of_truth import DEFAULTS_PATH
4
4
  from machineconfig.utils.accessories import pprint
@@ -0,0 +1,229 @@
1
+ """Pure Python implementation for croshell command - no typer dependencies."""
2
+
3
+ from typing import Optional
4
+ from pathlib import Path
5
+
6
+
7
+ def croshell(
8
+ path: Optional[str],
9
+ project_path: Optional[str],
10
+ uv_with: Optional[str],
11
+ marimo: bool,
12
+ jupyter: bool,
13
+ vscode: bool,
14
+ visidata: bool,
15
+ python: bool,
16
+ profile: Optional[str],
17
+ ) -> None:
18
+ """Cross-shell command execution."""
19
+ interactivity = "-i"
20
+ interpreter = "python" if python else "ipython"
21
+ if uv_with is not None:
22
+ match interpreter:
23
+ case "ipython":
24
+ user_uv_with_line = f"--with {uv_with},ipython"
25
+ case "python":
26
+ user_uv_with_line = f"--with {uv_with}"
27
+ case _:
28
+ raise ValueError(f"Unknown interpreter: {interpreter}")
29
+ else:
30
+ match interpreter:
31
+ case "ipython":
32
+ user_uv_with_line = "--with ipython"
33
+ case "python":
34
+ user_uv_with_line = ""
35
+ case _:
36
+ raise ValueError(f"Unknown interpreter: {interpreter}")
37
+
38
+ if project_path is not None:
39
+ uv_project_line = f'--project {project_path}'
40
+ uv_python_line = ""
41
+ else:
42
+ uv_project_line = ""
43
+ uv_python_line = "--python 3.14"
44
+
45
+ from machineconfig.scripts.python.helpers.helpers_croshell.crosh import get_read_python_file_pycode, get_read_data_pycode
46
+ from machineconfig.utils.meta import lambda_to_python_script
47
+ from machineconfig.utils.accessories import randstr
48
+ from machineconfig.utils.ve import get_ve_path_and_ipython_profile
49
+ import json
50
+ from rich.console import Console
51
+ from rich.panel import Panel
52
+ console = Console()
53
+
54
+ ipython_profile: Optional[str] = profile
55
+ file_obj = Path.cwd()
56
+ if path is not None:
57
+ from machineconfig.utils.path_helper import get_choice_file
58
+ choice_file = get_choice_file(path=path, suffixes={".*"})
59
+ if project_path is None:
60
+ ve_path, _ = get_ve_path_and_ipython_profile(choice_file)
61
+ if ve_path is not None:
62
+ ve_path_obj = Path(ve_path)
63
+ uv_project_line = f'--project {ve_path_obj.parent}'
64
+ uv_python_line = ""
65
+ if choice_file.suffix == ".py":
66
+ program = choice_file.read_text(encoding="utf-8")
67
+ text = f"📄 Selected file: {choice_file.name}"
68
+ console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
69
+ else:
70
+ program = lambda_to_python_script(
71
+ lambda: get_read_data_pycode(path=str(choice_file)),
72
+ in_global=True, import_module=False
73
+ )
74
+ text = f"📄 Reading data from: {file_obj.name}"
75
+ console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
76
+ else:
77
+ program = ""
78
+
79
+ if Path.home().joinpath("code/machineconfig").exists() and uv_project_line == "":
80
+ uv_project_line = f'--project "{str(Path.home().joinpath("code/machineconfig"))}"'
81
+
82
+ preprogram = _build_preprogram()
83
+
84
+ pyfile = Path.home().joinpath(f"tmp_results/tmp_scripts/python/croshell/{randstr()}/script.py")
85
+ pyfile.parent.mkdir(parents=True, exist_ok=True)
86
+ title = "Reading Data"
87
+ def_code = lambda_to_python_script(
88
+ lambda: get_read_python_file_pycode(path=str(pyfile), title=title),
89
+ in_global=False, import_module=False
90
+ )
91
+ python_program = preprogram + "\n\n" + def_code + program
92
+ pyfile.write_text(python_program, encoding="utf-8")
93
+ ipython_profile = ipython_profile if ipython_profile is not None else "default"
94
+
95
+ nb_target = pyfile.with_suffix(".ipynb")
96
+ if jupyter:
97
+ try:
98
+ nb_path = pyfile.with_suffix(".ipynb")
99
+ nb_content = {
100
+ "cells": [
101
+ {
102
+ "cell_type": "code",
103
+ "metadata": {"language": "python"},
104
+ "source": [python_program],
105
+ "outputs": [],
106
+ "execution_count": None,
107
+ }
108
+ ],
109
+ "metadata": {},
110
+ "nbformat": 4,
111
+ "nbformat_minor": 5,
112
+ }
113
+ nb_path.write_text(json.dumps(nb_content), encoding="utf-8")
114
+ nb_target = nb_path
115
+ except Exception:
116
+ pass
117
+
118
+ fire_line = _build_fire_line(
119
+ file_obj=file_obj,
120
+ pyfile=pyfile,
121
+ nb_target=nb_target,
122
+ visidata=visidata,
123
+ marimo=marimo,
124
+ jupyter=jupyter,
125
+ vscode=vscode,
126
+ interpreter=interpreter,
127
+ interactivity=interactivity,
128
+ ipython_profile=ipython_profile,
129
+ uv_python_line=uv_python_line,
130
+ uv_project_line=uv_project_line,
131
+ user_uv_with_line=user_uv_with_line,
132
+ uv_with=uv_with,
133
+ )
134
+
135
+ from machineconfig.utils.code import exit_then_run_shell_script
136
+ exit_then_run_shell_script(fire_line, strict=False)
137
+
138
+
139
+ def _build_preprogram() -> str:
140
+ """Build the preprogram code for croshell."""
141
+ import inspect
142
+ import textwrap
143
+ from types import FunctionType
144
+
145
+ def get_body_simple_function_no_args(f: FunctionType) -> str:
146
+ return textwrap.dedent("\n".join(inspect.getsource(f).splitlines()[1:]))
147
+
148
+ preprogram = """
149
+ #%%
150
+ """
151
+
152
+ def preprogram_func() -> None:
153
+ try:
154
+ from machineconfig.utils.files.headers import print_header, print_logo
155
+ print_header()
156
+ print_logo("Machineconfig")
157
+ from machineconfig.utils.path_extended import PathExtended
158
+ _ = PathExtended
159
+ except ImportError:
160
+ print("machineconfig is not installed in the current environment.")
161
+ pass
162
+ from pathlib import Path
163
+ _ = Path
164
+
165
+ preprogram += get_body_simple_function_no_args(preprogram_func)
166
+ return preprogram
167
+
168
+
169
+ def _build_fire_line(
170
+ file_obj: Path,
171
+ pyfile: Path,
172
+ nb_target: Path,
173
+ visidata: bool,
174
+ marimo: bool,
175
+ jupyter: bool,
176
+ vscode: bool,
177
+ interpreter: str,
178
+ interactivity: str,
179
+ ipython_profile: str,
180
+ uv_python_line: str,
181
+ uv_project_line: str,
182
+ user_uv_with_line: str,
183
+ uv_with: Optional[str],
184
+ ) -> str:
185
+ """Build the fire line command for croshell."""
186
+ if visidata:
187
+ if file_obj.suffix == ".json":
188
+ fire_line = f"uv run {uv_python_line} {user_uv_with_line} {uv_project_line} --with visidata vd {str(file_obj)}"
189
+ else:
190
+ fire_line = f"uv run {uv_python_line} {user_uv_with_line} {uv_project_line} --with visidata,pyarrow vd {str(file_obj)}"
191
+ elif marimo:
192
+ if Path.home().joinpath("code/machineconfig").exists():
193
+ requirements = f"""{user_uv_with_line} {uv_project_line} --with marimo,sqlglot """
194
+ else:
195
+ requirements = f"""{uv_python_line} {user_uv_with_line} {uv_project_line} --with "marimo,sqlglot,cowsay,machineconfig[plot]>=8.61" """
196
+ fire_line = f"""
197
+ cd {str(pyfile.parent)}
198
+ uv run {uv_python_line} --with "marimo" marimo convert {pyfile.name} -o marimo_nb.py
199
+ uv run {requirements} marimo edit --host 0.0.0.0 marimo_nb.py
200
+ """
201
+ elif jupyter:
202
+ if Path.home().joinpath("code/machineconfig").exists():
203
+ requirements = f"""{user_uv_with_line} {uv_project_line} --with jupyterlab """
204
+ else:
205
+ requirements = f"""{user_uv_with_line} {uv_project_line} --with "cowsay,machineconfig[plot]>=8.61" """
206
+ fire_line = f"uv run {requirements} {uv_project_line} jupyter-lab {str(nb_target)}"
207
+ elif vscode:
208
+ user_uv_add = f"uv add {uv_with}" if uv_with is not None else ""
209
+ fire_line = f"""
210
+ cd {str(pyfile.parent)}
211
+ uv init {uv_python_line}
212
+ uv venv
213
+ uv add "cowsay,machineconfig[plot]>=8.61"
214
+ uv add {user_uv_add}
215
+ # code serve-web
216
+ code --new-window {str(pyfile)}
217
+ """
218
+ else:
219
+ if interpreter == "ipython":
220
+ profile = f" --profile {ipython_profile} --no-banner"
221
+ else:
222
+ profile = ""
223
+ if Path.home().joinpath("code/machineconfig").exists():
224
+ ve_line = f"""{user_uv_with_line} {uv_project_line} """
225
+ else:
226
+ ve_line = f"""{uv_python_line} {user_uv_with_line} {uv_project_line} --with "cowsay,machineconfig[plot]>=8.61" """
227
+ fire_line = f"uv run {ve_line} {interpreter} {interactivity} {profile} {str(pyfile)}"
228
+
229
+ return fire_line
@@ -26,11 +26,11 @@
26
26
 
27
27
  # print(f"\n✅ Running tasks in {root}\n")
28
28
 
29
- # if args.report:
30
- # print("📊 Generating report...")
31
- # reports: list[Report] = [Report.from_path(read_task_from_dir(x).report_path) for x in PathExtended(root).search("*").filter(lambda path: path.joinpath("task.py").exists())]
29
+ # if args.report:
30
+ # print("📊 Generating report...")
31
+ # reports: list[Report] = [Report.from_path(read_task_from_dir(x).report_path) for x in PathExtended(root).glob("*")]
32
32
 
33
- # # Format as markdown table
33
+ # Format as markdown table
34
34
  # report_data = [r.__dict__ for r in reports]
35
35
  # if report_data:
36
36
  # # Get keys from first report
@@ -83,19 +83,20 @@ def main(
83
83
 
84
84
  md_file = report_dir.joinpath("slides.md")
85
85
  if not md_file.exists():
86
- res = report_dir.search("*.md")
86
+ res = list(report_dir.glob("*.md"))
87
87
  if len(res) == 1:
88
88
  md_file = res[0]
89
89
  else:
90
- raise FileNotFoundError(f"❌ slides.md not found in {report_dir}")
90
+ print(f"❌ Error: slides.md not found in {report_dir}")
91
+ raise typer.Exit(code=1)
91
92
 
92
93
  print("📂 Copying files to Slidev repository...")
93
- for item in report_dir.search():
94
- item.copy(folder=SLIDEV_REPO, overwrite=True)
94
+ for item in report_dir.glob("*"):
95
+ PathExtended(item).copy(folder=SLIDEV_REPO, overwrite=True)
95
96
  if md_file.name != "slides.md":
96
97
  SLIDEV_REPO.joinpath(md_file.name).with_name(name="slides.md", inplace=True, overwrite=True)
97
98
 
98
- import machineconfig.scripts.python.helpers_network.address as helper
99
+ import machineconfig.scripts.python.helpers.helpers_network.address as helper
99
100
  res = helper.select_lan_ipv4(prefer_vpn=False)
100
101
  if res is None:
101
102
  print("❌ Error: Could not determine local LAN IPv4 address for presentation.")
@@ -107,7 +108,7 @@ def main(
107
108
  print(f" - http://localhost:{port}")
108
109
  print(f" - http://{local_ip_v4}:{port}\n")
109
110
 
110
- program = "npm run dev slides.md -- --remote"
111
+ program = "bun run dev slides.md -- --remote"
111
112
  # PROGRAM_PATH.write_text(program, encoding="utf-8")
112
113
  import subprocess
113
114
 
@@ -0,0 +1,149 @@
1
+ """Backup configuration types, parsing, and reading utilities."""
2
+
3
+ from collections.abc import Mapping
4
+ from typing import TypedDict
5
+ from pathlib import Path
6
+ from rich.console import Console
7
+ from rich.panel import Panel
8
+ import tomllib
9
+
10
+ from machineconfig.utils.source_of_truth import LIBRARY_ROOT
11
+ from machineconfig.profile.create_links_export import REPO_LOOSE
12
+
13
+ LIBRARY_BACKUP_PATH = LIBRARY_ROOT.joinpath("profile/mapper_data.toml")
14
+ USER_BACKUP_PATH = Path.home().joinpath("dotfiles/machineconfig/mapper_data.toml")
15
+ DEFAULT_BACKUP_HEADER = "# User-defined backup configuration\n# Created by `devops data register`\n"
16
+ VALID_OS = {"any", "windows", "linux", "darwin"}
17
+
18
+
19
+ class BackupItem(TypedDict):
20
+ path_local: str
21
+ path_cloud: str | None
22
+ zip: bool
23
+ encrypt: bool
24
+ rel2home: bool
25
+ os: set[str]
26
+
27
+
28
+ BackupGroup = dict[str, BackupItem]
29
+ BackupConfig = dict[str, BackupGroup]
30
+
31
+
32
+ def normalize_os_name(value: str) -> str:
33
+ return value.strip().lower()
34
+
35
+
36
+ def _parse_os_field(os_field: object, item_name: str) -> set[str]:
37
+ if os_field is None:
38
+ raise ValueError(f"Backup entry '{item_name}' must define a non-empty 'os'.")
39
+ if isinstance(os_field, list):
40
+ raw_values = [str(item) for item in os_field]
41
+ elif isinstance(os_field, str):
42
+ raw_values = os_field.split(",")
43
+ else:
44
+ raise ValueError(f"Backup entry '{item_name}' has an invalid 'os' value: {os_field!r}.")
45
+ values: set[str] = set()
46
+ for raw in raw_values:
47
+ token = normalize_os_name(raw)
48
+ if not token:
49
+ continue
50
+ if token in {"any", "all", "*"}:
51
+ return {"any"}
52
+ if token not in VALID_OS:
53
+ raise ValueError(f"Backup entry '{item_name}' has an invalid 'os' value: {os_field!r}.")
54
+ values.add(token)
55
+ if not values:
56
+ raise ValueError(f"Backup entry '{item_name}' must define a non-empty 'os'.")
57
+ return values
58
+
59
+
60
+ def os_applies(os_values: set[str], system_name: str) -> bool:
61
+ return "any" in os_values or system_name in os_values
62
+
63
+
64
+ def _parse_bool(value: object, field: str, item_name: str) -> bool:
65
+ if isinstance(value, bool):
66
+ return value
67
+ raise ValueError(f"Backup entry '{item_name}' has an invalid '{field}' value.")
68
+
69
+
70
+ def _require_mapping(value: object, item_name: str) -> Mapping[str, object]:
71
+ if not isinstance(value, Mapping):
72
+ raise ValueError(f"Backup entry '{item_name}' must be a table.")
73
+ return value
74
+
75
+
76
+ def _require_str_field(raw: Mapping[str, object], field: str, item_name: str) -> str:
77
+ value = raw.get(field)
78
+ if not isinstance(value, str) or not value.strip():
79
+ raise ValueError(f"Backup entry '{item_name}' must define a non-empty '{field}'.")
80
+ return value.strip()
81
+
82
+
83
+ def _optional_str_field(raw: Mapping[str, object], field: str, item_name: str) -> str | None:
84
+ if field not in raw:
85
+ return None
86
+ value = raw.get(field)
87
+ if not isinstance(value, str):
88
+ raise ValueError(f"Backup entry '{item_name}' has a non-string '{field}'.")
89
+ token = value.strip()
90
+ if not token:
91
+ raise ValueError(f"Backup entry '{item_name}' has an empty '{field}'.")
92
+ return token
93
+
94
+
95
+ def _require_bool_field(raw: Mapping[str, object], field: str, item_name: str) -> bool:
96
+ if field not in raw:
97
+ raise ValueError(f"Backup entry '{item_name}' must define '{field}'.")
98
+ return _parse_bool(raw[field], field=field, item_name=item_name)
99
+
100
+
101
+ def _parse_backup_config(raw: Mapping[str, object]) -> BackupConfig:
102
+ config: BackupConfig = {}
103
+ for group_name, group_value in raw.items():
104
+ group = _require_mapping(group_value, group_name)
105
+ group_items: dict[str, BackupItem] = {}
106
+ for item_name, value in group.items():
107
+ item_key = f"{group_name}.{item_name}"
108
+ item = _require_mapping(value, item_key)
109
+ if "path" in item:
110
+ raise ValueError(f"Backup entry '{item_key}' uses 'path'; use 'path_local' instead.")
111
+ if "path_remote" in item:
112
+ raise ValueError(f"Backup entry '{item_key}' uses 'path_remote'; use 'path_cloud' instead.")
113
+ if "os_specific" in item:
114
+ raise ValueError(f"Backup entry '{item_key}' uses 'os_specific'; use 'os' only.")
115
+ group_items[item_name] = {
116
+ "path_local": _require_str_field(item, "path_local", item_key),
117
+ "path_cloud": _optional_str_field(item, "path_cloud", item_key),
118
+ "zip": _require_bool_field(item, "zip", item_key),
119
+ "encrypt": _require_bool_field(item, "encrypt", item_key),
120
+ "rel2home": _require_bool_field(item, "rel2home", item_key),
121
+ "os": _parse_os_field(item.get("os"), item_key),
122
+ }
123
+ if group_items:
124
+ config[group_name] = group_items
125
+ return config
126
+
127
+
128
+ def read_backup_config(repo: REPO_LOOSE) -> BackupConfig:
129
+ match repo:
130
+ case "library" | "l":
131
+ path = LIBRARY_BACKUP_PATH
132
+ raw_config: dict[str, object] = tomllib.loads(path.read_text(encoding="utf-8"))
133
+ bu_file = _parse_backup_config(raw_config)
134
+ case "user" | "u":
135
+ path = USER_BACKUP_PATH
136
+ raw_config = tomllib.loads(path.read_text(encoding="utf-8"))
137
+ bu_file = _parse_backup_config(raw_config)
138
+ case "all" | "a":
139
+ console = Console()
140
+ console.print(Panel(f"🧰 LOADING LIBRARY BACKUP CONFIGURATION\n📄 File: {LIBRARY_BACKUP_PATH}", title="[bold blue]Backup Configuration[/bold blue]", border_style="blue"))
141
+ raw_library: dict[str, object] = tomllib.loads(LIBRARY_BACKUP_PATH.read_text(encoding="utf-8"))
142
+ bu_library = _parse_backup_config(raw_library)
143
+ console.print(Panel(f"🧰 LOADING USER BACKUP CONFIGURATION\n📄 File: {USER_BACKUP_PATH}", title="[bold blue]Backup Configuration[/bold blue]", border_style="blue"))
144
+ raw_user: dict[str, object] = tomllib.loads(USER_BACKUP_PATH.read_text(encoding="utf-8"))
145
+ bu_user = _parse_backup_config(raw_user)
146
+ bu_file = {**bu_library, **bu_user}
147
+ case _:
148
+ raise ValueError(f"Invalid which_backup value: {repo!r}.")
149
+ return bu_file