machineconfig 6.61__tar.gz → 6.63__tar.gz

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

Potentially problematic release.


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

Files changed (450) hide show
  1. {machineconfig-6.61/src/machineconfig.egg-info → machineconfig-6.63}/PKG-INFO +1 -1
  2. {machineconfig-6.61 → machineconfig-6.63}/pyproject.toml +1 -1
  3. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ftpx.py +1 -1
  4. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/cli_utils.py +26 -1
  5. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/utils.py +3 -1
  6. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/ssh.py +73 -126
  7. machineconfig-6.63/src/machineconfig/utils/terminal.py +100 -0
  8. {machineconfig-6.61 → machineconfig-6.63/src/machineconfig.egg-info}/PKG-INFO +1 -1
  9. machineconfig-6.61/src/machineconfig/utils/terminal.py +0 -211
  10. {machineconfig-6.61 → machineconfig-6.63}/MANIFEST.in +0 -0
  11. {machineconfig-6.61 → machineconfig-6.63}/README.md +0 -0
  12. {machineconfig-6.61 → machineconfig-6.63}/setup.cfg +0 -0
  13. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/__init__.py +0 -0
  14. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/__init__.py +0 -0
  15. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/remote/cloud_manager.py +0 -0
  16. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/remote/data_transfer.py +0 -0
  17. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/remote/distribute.py +0 -0
  18. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/remote/file_manager.py +0 -0
  19. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/remote/job_params.py +0 -0
  20. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/remote/loader_runner.py +0 -0
  21. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/remote/remote_machine.py +0 -0
  22. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/remote/run_cloud.py +0 -0
  23. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/remote/run_cluster.py +0 -0
  24. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/remote/run_remote.py +0 -0
  25. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/remote/script_execution.py +0 -0
  26. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/remote/script_notify_upon_completion.py +0 -0
  27. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/__init__.py +0 -0
  28. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/helpers/enhanced_command_runner.py +0 -0
  29. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/helpers/load_balancer_helper.py +0 -0
  30. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/utils/load_balancer.py +0 -0
  31. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/utils/maker.py +0 -0
  32. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/wt_local.py +0 -0
  33. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/wt_local_manager.py +0 -0
  34. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/wt_remote.py +0 -0
  35. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/wt_remote_manager.py +0 -0
  36. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +0 -0
  37. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/wt_utils/process_monitor.py +0 -0
  38. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/wt_utils/remote_executor.py +0 -0
  39. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/wt_utils/session_manager.py +0 -0
  40. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +0 -0
  41. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/zellij_local.py +0 -0
  42. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/zellij_local_manager.py +0 -0
  43. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/zellij_remote.py +0 -0
  44. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/zellij_remote_manager.py +0 -0
  45. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +0 -0
  46. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +0 -0
  47. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/zellij_utils/monitoring_types.py +0 -0
  48. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +0 -0
  49. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/zellij_utils/remote_executor.py +0 -0
  50. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/zellij_utils/session_manager.py +0 -0
  51. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +0 -0
  52. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +0 -0
  53. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +0 -0
  54. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +0 -0
  55. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +0 -0
  56. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/templates/__init__.py +0 -0
  57. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/cluster/templates/cli_trogon.py +0 -0
  58. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/__init__.py +0 -0
  59. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/__init__.py +0 -0
  60. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/check_installations.py +0 -0
  61. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom/gh.py +0 -0
  62. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom/hx.py +0 -0
  63. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom_dev/__init__.py +0 -0
  64. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom_dev/alacritty.py +0 -0
  65. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom_dev/brave.py +0 -0
  66. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom_dev/bypass_paywall.py +0 -0
  67. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom_dev/code.py +0 -0
  68. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom_dev/cursor.py +0 -0
  69. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +0 -0
  70. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom_dev/espanso.py +0 -0
  71. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom_dev/goes.py +0 -0
  72. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom_dev/lvim.py +0 -0
  73. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom_dev/nerdfont.py +0 -0
  74. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +0 -0
  75. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom_dev/redis.py +0 -0
  76. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom_dev/wezterm.py +0 -0
  77. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/custom_dev/winget.py +0 -0
  78. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/installer_data.json +0 -0
  79. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/linux_scripts/brave.sh +0 -0
  80. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/linux_scripts/docker.sh +0 -0
  81. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/linux_scripts/docker_start.sh +0 -0
  82. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/linux_scripts/edge.sh +0 -0
  83. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/linux_scripts/nerdfont.sh +0 -0
  84. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/linux_scripts/ngrok.sh +0 -0
  85. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -0
  86. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/linux_scripts/q.sh +0 -0
  87. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/linux_scripts/redis.sh +0 -0
  88. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -0
  89. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/linux_scripts/vscode.sh +0 -0
  90. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/linux_scripts/warp-cli.sh +0 -0
  91. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/linux_scripts/wezterm.sh +0 -0
  92. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/package_groups.py +0 -0
  93. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +0 -0
  94. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/linux/msc/cli_agents.sh +0 -0
  95. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/linux/msc/lid.sh +0 -0
  96. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/linux/msc/network.sh +0 -0
  97. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/python/__init__.py +0 -0
  98. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/python/python_ve_symlink.py +0 -0
  99. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/python/vscode/api.py +0 -0
  100. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -0
  101. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/windows/archive/openssh-server_add_key.ps1 +0 -0
  102. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/windows/archive/openssh-server_copy-ssh-id.ps1 +0 -0
  103. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/windows/msc/cli_agents.bat +0 -0
  104. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/jobs/windows/msc/cli_agents.ps1 +0 -0
  105. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/logger.py +0 -0
  106. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/profile/__init__.py +0 -0
  107. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/profile/backup.toml +0 -0
  108. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/profile/bash_shell_profiles.md +0 -0
  109. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/profile/create_helper.py +0 -0
  110. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/profile/create_links.py +0 -0
  111. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/profile/create_links_export.py +0 -0
  112. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/profile/create_shell_profile.py +0 -0
  113. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/profile/mapper.toml +0 -0
  114. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/profile/records/generic/shares.toml +0 -0
  115. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/profile/records/linux/apps_summary_report.csv +0 -0
  116. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/profile/records/linux/apps_summary_report.md +0 -0
  117. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/profile/records/windows/apps_summary_report.csv +0 -0
  118. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/profile/records/windows/apps_summary_report.md +0 -0
  119. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +0 -0
  120. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/__init__.py +0 -0
  121. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/linux/fzf2g +0 -0
  122. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/linux/fzfag +0 -0
  123. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/linux/fzffg +0 -0
  124. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/linux/fzfg +0 -0
  125. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/linux/fzfrga +0 -0
  126. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/linux/other/share_cloud.sh +0 -0
  127. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/linux/other/share_nfs +0 -0
  128. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/linux/other/share_smb +0 -0
  129. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/linux/other/start_docker +0 -0
  130. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/linux/other/switch_ip +0 -0
  131. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/linux/skrg +0 -0
  132. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/linux/warp-cli.sh +0 -0
  133. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/linux/z_ls +0 -0
  134. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/__init__.py +0 -0
  135. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/agents.py +0 -0
  136. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/__init__.py +0 -0
  137. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/command_runner/command_runner.sh +0 -0
  138. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -0
  139. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/generate_files.py +0 -0
  140. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/initai.py +0 -0
  141. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +0 -0
  142. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +0 -0
  143. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/__init__.py +0 -0
  144. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/_shared.py +0 -0
  145. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/claude/claude.py +0 -0
  146. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/cline/cline.py +0 -0
  147. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/copilot/chatmodes/Thinking-Beast-Mode.chatmode.md +0 -0
  148. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/copilot/chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md +0 -0
  149. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/copilot/chatmodes/deepResearch.chatmode.md +0 -0
  150. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +0 -0
  151. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +0 -0
  152. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/copilot/privacy.md +0 -0
  153. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +0 -0
  154. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/copilot/prompts/research-report-skeleton.prompt.md +0 -0
  155. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/crush/crush.json +0 -0
  156. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/crush/crush.py +0 -0
  157. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/crush/privacy.md +0 -0
  158. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/cursor/cursors.py +0 -0
  159. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/gemini/gemini.py +0 -0
  160. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/gemini/settings.json +0 -0
  161. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/generic.py +0 -0
  162. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/kilocode/privacy.md +0 -0
  163. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/opencode/opencode.json +0 -0
  164. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/solutions/opencode/opencode.py +0 -0
  165. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/ai/vscode_tasks.py +0 -0
  166. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/cloud.py +0 -0
  167. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/croshell.py +0 -0
  168. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/devops.py +0 -0
  169. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/devops_navigator.py +0 -0
  170. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/entry.py +0 -0
  171. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/env_manager/__init__.py +0 -0
  172. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/env_manager/path_manager_backend.py +0 -0
  173. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/env_manager/path_manager_tui.py +0 -0
  174. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/fire_jobs.py +0 -0
  175. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_cloud/__init__.py +0 -0
  176. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_cloud/cloud_copy.py +0 -0
  177. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_cloud/cloud_helpers.py +0 -0
  178. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_cloud/cloud_mount.py +0 -0
  179. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_cloud/cloud_sync.py +0 -0
  180. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_cloud/helpers2.py +0 -0
  181. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_cloud/helpers5.py +0 -0
  182. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_croshell/__init__.py +0 -0
  183. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_croshell/crosh.py +0 -0
  184. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_croshell/pomodoro.py +0 -0
  185. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_croshell/scheduler.py +0 -0
  186. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_croshell/start_slidev.py +0 -0
  187. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_croshell/viewer.py +0 -0
  188. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_croshell/viewer_template.py +0 -0
  189. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/__init__.py +0 -0
  190. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/cli_config.py +0 -0
  191. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +0 -0
  192. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/cli_data.py +0 -0
  193. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/cli_nw.py +0 -0
  194. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -0
  195. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/cli_self.py +0 -0
  196. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/cli_share_server.py +0 -0
  197. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/cli_terminal.py +0 -0
  198. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +0 -0
  199. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/devops_status.py +0 -0
  200. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/devops_update_repos.py +0 -0
  201. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/themes/__init__.py +0 -0
  202. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +0 -0
  203. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +0 -0
  204. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.ps1 +0 -0
  205. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_devops/themes/choose_wezterm_theme.py +0 -0
  206. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire/__init__.py +0 -0
  207. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire/agentic_frameworks/__init__.py +0 -0
  208. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.json +0 -0
  209. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -0
  210. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_cursor_agents.py +0 -0
  211. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -0
  212. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -0
  213. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire/fire_agents_help_launch.py +0 -0
  214. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire/fire_agents_help_search.py +0 -0
  215. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire/fire_agents_helper_types.py +0 -0
  216. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire/fire_agents_load_balancer.py +0 -0
  217. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire/helpers4.py +0 -0
  218. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire/prompt.txt +0 -0
  219. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire/template.ps1 +0 -0
  220. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire/template.sh +0 -0
  221. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  222. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire_command/cloud_manager.py +0 -0
  223. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +0 -0
  224. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +0 -0
  225. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  226. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_navigator/__init__.py +0 -0
  227. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_navigator/command_builder.py +0 -0
  228. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_navigator/command_detail.py +0 -0
  229. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_navigator/command_tree.py +0 -0
  230. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_navigator/data_models.py +0 -0
  231. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_navigator/main_app.py +0 -0
  232. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_navigator/search_bar.py +0 -0
  233. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_repos/action.py +0 -0
  234. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_repos/clone.py +0 -0
  235. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +0 -0
  236. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_repos/count_lines.py +0 -0
  237. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +0 -0
  238. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -0
  239. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_repos/grource.py +0 -0
  240. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_repos/record.py +0 -0
  241. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -0
  242. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_repos/sync.py +0 -0
  243. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_repos/update.py +0 -0
  244. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  245. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +0 -0
  246. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/interactive.py +0 -0
  247. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/__init__.py +0 -0
  248. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/add_ssh_key.py +0 -0
  249. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/devops_add_identity.py +0 -0
  250. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/devops_add_ssh_key.py +0 -0
  251. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/mount_drive +0 -0
  252. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/mount_nfs +0 -0
  253. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/mount_nfs.py +0 -0
  254. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/mount_nw_drive +0 -0
  255. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/mount_nw_drive.py +0 -0
  256. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/mount_smb +0 -0
  257. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/mount_ssh.py +0 -0
  258. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/onetimeshare.py +0 -0
  259. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/ssh_debug_linux.py +0 -0
  260. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/ssh_debug_windows.py +0 -0
  261. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/wifi_conn.py +0 -0
  262. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -0
  263. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/python/sessions.py +0 -0
  264. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/windows/fzfb.ps1 +0 -0
  265. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/windows/fzfg.ps1 +0 -0
  266. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/windows/fzfrga.bat +0 -0
  267. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/windows/mounts/mount_nfs.ps1 +0 -0
  268. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/windows/mounts/mount_nw.ps1 +0 -0
  269. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/windows/mounts/mount_smb.ps1 +0 -0
  270. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -0
  271. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/windows/mounts/share_cloud.cmd +0 -0
  272. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/windows/mounts/share_smb.ps1 +0 -0
  273. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/scripts/windows/mounts/unlock_bitlocker.ps1 +0 -0
  274. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/__init__.py +0 -0
  275. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/broot/br.sh +0 -0
  276. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/broot/brootcd.ps1 +0 -0
  277. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/broot/conf.toml +0 -0
  278. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/glow/glow.yml +0 -0
  279. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/gromit-mpx/gromit-mpx.cfg +0 -0
  280. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/helix/config.toml +0 -0
  281. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/helix/languages.toml +0 -0
  282. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/keras/keras.json +0 -0
  283. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/keyboard/espanso/config/default.yml +0 -0
  284. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/keyboard/espanso/match/base.yml +0 -0
  285. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/keyboard/kanata/kanata.kbd +0 -0
  286. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/autocall/delete.sh +0 -0
  287. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/autocall/on-cd.sh +0 -0
  288. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/autocall/on-quit.sh +0 -0
  289. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/autocall/open.sh +0 -0
  290. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/autocall/paste.sh +0 -0
  291. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/autocall/pre-cd.sh +0 -0
  292. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/autocall/rename.sh +0 -0
  293. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/colors +0 -0
  294. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/exe/cleaner.sh +0 -0
  295. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -0
  296. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/exe/leftpane_previewer.sh +0 -0
  297. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/exe/lfcd.sh +0 -0
  298. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/exe/previewer.sh +0 -0
  299. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/exe/previewer_archive.sh +0 -0
  300. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/icons +0 -0
  301. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/linux/lfrc +0 -0
  302. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/autocall/delete.ps1 +0 -0
  303. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/autocall/on-cd.ps1 +0 -0
  304. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/autocall/on-quit.ps1 +0 -0
  305. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/autocall/open.ps1 +0 -0
  306. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/autocall/paste.ps1 +0 -0
  307. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/autocall/pre-cd.ps1 +0 -0
  308. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/autocall/rename.ps1 +0 -0
  309. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/cd_tere.ps1 +0 -0
  310. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/cd_zoxide.ps1 +0 -0
  311. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/cd_zoxide2.ps1 +0 -0
  312. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/colors +0 -0
  313. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -0
  314. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/icons +0 -0
  315. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/leftpane_previewer.ps1 +0 -0
  316. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/lfcd.ps1 +0 -0
  317. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/lfrc +0 -0
  318. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/mkdir.ps1 +0 -0
  319. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/mkfile.ps1 +0 -0
  320. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/previewer.ps1 +0 -0
  321. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lf/windows/tst.ps1 +0 -0
  322. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/linters/.flake8 +0 -0
  323. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/linters/.mypy.ini +0 -0
  324. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/linters/.pylintrc +0 -0
  325. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/linters/.ruff.toml +0 -0
  326. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lvim/linux/config.lua +0 -0
  327. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -0
  328. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lvim/windows/config.lua +0 -0
  329. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/lvim/windows/lua/user/custom_config.lua +0 -0
  330. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/marimo/marimo.toml +0 -0
  331. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/mprocs/windows/mprocs.yaml +0 -0
  332. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/mprocs/windows/other +0 -0
  333. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/pistol/pistol.conf +0 -0
  334. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/presenterm/config.yaml +0 -0
  335. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/procs/.procs.toml +0 -0
  336. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/pudb/pudb.cfg +0 -0
  337. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/rofi/config.rasi +0 -0
  338. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/rofi/config_default.rasi +0 -0
  339. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/alacritty/alacritty.toml +0 -0
  340. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/alacritty/alacritty.yml +0 -0
  341. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/bash/init.sh +0 -0
  342. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/hyper/.hyper.js +0 -0
  343. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/ipy/profiles/default/__init__.py +0 -0
  344. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/ipy/profiles/default/startup/__init__.py +0 -0
  345. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +0 -0
  346. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/kitty/kitty.conf +0 -0
  347. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/nushell/config.nu +0 -0
  348. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/nushell/env.nu +0 -0
  349. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/pwsh/init.ps1 +0 -0
  350. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/pwsh/profile.ps1 +0 -0
  351. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/starship/starship.toml +0 -0
  352. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/vtm/settings.xml +0 -0
  353. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/wezterm/wezterm.lua +0 -0
  354. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/wt/settings.json +0 -0
  355. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/shells/zsh/init.sh +0 -0
  356. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/streamlit/config.toml +0 -0
  357. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/svim/linux/init.toml +0 -0
  358. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/svim/windows/init.toml +0 -0
  359. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/tere/terecd.ps1 +0 -0
  360. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/tere/terecd.sh +0 -0
  361. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/tmux/.tmate.conf +0 -0
  362. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/tmux/.tmux.conf +0 -0
  363. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/wsl/.wslconfig +0 -0
  364. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/yazi/keymap.toml +0 -0
  365. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/yazi/theme.toml +0 -0
  366. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/yazi/yazi.toml +0 -0
  367. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/zed/settings.json +0 -0
  368. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/zellij/commands/monitor +0 -0
  369. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/zellij/commands/standard_panes +0 -0
  370. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/zellij/config.kdl +0 -0
  371. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/zellij/config.orig.kdl +0 -0
  372. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/zellij/layouts/hist +0 -0
  373. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/zellij/layouts/panes.kdl +0 -0
  374. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/zellij/layouts/st.kdl +0 -0
  375. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/zellij/layouts/st2.kdl +0 -0
  376. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/settings/zellij/layouts/stacked_panes.kdl +0 -0
  377. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_linux/__init__.py +0 -0
  378. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_linux/apps.sh +0 -0
  379. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_linux/apps_desktop.sh +0 -0
  380. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_linux/apps_gui.sh +0 -0
  381. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_linux/nix/cli_installation.sh +0 -0
  382. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -0
  383. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_linux/ssh/openssh_all.sh +0 -0
  384. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -0
  385. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_linux/uv.sh +0 -0
  386. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_linux/web_shortcuts/android.sh +0 -0
  387. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_linux/web_shortcuts/interactive.sh +0 -0
  388. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_mac/__init__.py +0 -0
  389. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_mac/apps.sh +0 -0
  390. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_mac/ssh/openssh_setup.sh +0 -0
  391. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_mac/uv.sh +0 -0
  392. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_windows/__init__.py +0 -0
  393. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_windows/apps.ps1 +0 -0
  394. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_windows/others/docker.ps1 +0 -0
  395. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_windows/others/obs.ps1 +0 -0
  396. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_windows/others/power_options.ps1 +0 -0
  397. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -0
  398. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_windows/ssh/add_identity.ps1 +0 -0
  399. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -0
  400. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_windows/uv.ps1 +0 -0
  401. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_windows/web_shortcuts/interactive.ps1 +0 -0
  402. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_windows/wt_and_pwsh/__init__.py +0 -0
  403. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +0 -0
  404. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/__init__.py +0 -0
  405. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/accessories.py +0 -0
  406. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/ai/__init__.py +0 -0
  407. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/cloud/onedrive/README.md +0 -0
  408. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/cloud/onedrive/setup_oauth.py +0 -0
  409. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/cloud/onedrive/transaction.py +0 -0
  410. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/code.py +0 -0
  411. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/files/art/fat_croco.txt +0 -0
  412. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/files/art/halfwit_croco.txt +0 -0
  413. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/files/art/happy_croco.txt +0 -0
  414. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/files/art/water_croco.txt +0 -0
  415. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/files/ascii_art.py +0 -0
  416. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/files/dbms.py +0 -0
  417. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/files/headers.py +0 -0
  418. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/files/ouch/__init__.py +0 -0
  419. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/files/ouch/decompress.py +0 -0
  420. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/files/read.py +0 -0
  421. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/installer.py +0 -0
  422. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/installer_utils/__init__.py +0 -0
  423. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/installer_utils/github_release_bulk.py +0 -0
  424. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/installer_utils/installer.py +0 -0
  425. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/installer_utils/installer_abc.py +0 -0
  426. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/installer_utils/installer_class.py +0 -0
  427. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/io.py +0 -0
  428. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/links.py +0 -0
  429. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/meta.py +0 -0
  430. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/notifications.py +0 -0
  431. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/options.py +0 -0
  432. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/path_extended.py +0 -0
  433. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/path_helper.py +0 -0
  434. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/procs.py +0 -0
  435. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/scheduler.py +0 -0
  436. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/scheduling.py +0 -0
  437. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/schemas/fire_agents/fire_agents_input.py +0 -0
  438. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/schemas/installer/installer_types.py +0 -0
  439. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/schemas/layouts/layout_types.py +0 -0
  440. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/schemas/repos/repos_types.py +0 -0
  441. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/source_of_truth.py +0 -0
  442. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/ssh_utils/utils.py +0 -0
  443. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/tst.py +0 -0
  444. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/upgrade_packages.py +0 -0
  445. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig/utils/ve.py +0 -0
  446. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig.egg-info/SOURCES.txt +0 -0
  447. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig.egg-info/dependency_links.txt +0 -0
  448. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig.egg-info/entry_points.txt +0 -0
  449. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig.egg-info/requires.txt +0 -0
  450. {machineconfig-6.61 → machineconfig-6.63}/src/machineconfig.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: machineconfig
3
- Version: 6.61
3
+ Version: 6.63
4
4
  Summary: Dotfiles management package
5
5
  Author-email: Alex Al-Saffar <programmer@usa.com>
6
6
  License: Apache 2.0
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "machineconfig"
9
- version = "6.61"
9
+ version = "6.63"
10
10
  description = "Dotfiles management package"
11
11
  readme = "README.md"
12
12
  license = {text = "Apache 2.0"}
@@ -183,7 +183,7 @@ def ftpx(
183
183
  padding=(1, 2),
184
184
  )
185
185
  )
186
- received_file = ssh.copy_from_here(source_path=resolved_source, target_path=resolved_target, compress_with_zip=zipFirst, recursive=recursive, overwrite_existing=False)
186
+ received_file = ssh.copy_from_here(source_path=resolved_source, target_rel2home=resolved_target, compress_with_zip=zipFirst, recursive=recursive, overwrite_existing=False)
187
187
 
188
188
  if source_is_remote and isinstance(received_file, PathExtended):
189
189
  console.print(
@@ -1,7 +1,7 @@
1
1
 
2
2
 
3
3
  import typer
4
- from typing import Annotated, Optional
4
+ from typing import Annotated, Optional, TypedDict
5
5
  from pathlib import Path
6
6
  import subprocess
7
7
  import requests
@@ -115,3 +115,28 @@ def merge_pdfs(
115
115
  from machineconfig.utils.code import run_shell_script, get_uv_command_executing_python_script
116
116
  uv_command, _py_file = get_uv_command_executing_python_script(python_script=code, uv_with=["pypdf"], uv_project_dir=None)
117
117
  run_shell_script(uv_command)
118
+
119
+
120
+ class MachineSpecs(TypedDict):
121
+ system: str
122
+ distro: str
123
+ home_dir: str
124
+ def get_machine_specs() -> MachineSpecs:
125
+ """Write print and return the local machine specs."""
126
+ import platform
127
+ UV_RUN_CMD = "$HOME/.local/bin/uv run" if platform.system() != "Windows" else """& "$env:USERPROFILE/.local/bin/uv" run"""
128
+ command = f"""{UV_RUN_CMD} --with distro python -c "import distro; print(distro.name(pretty=True))" """
129
+ import subprocess
130
+ distro = subprocess.run(command, shell=True, capture_output=True, text=True).stdout.strip()
131
+ specs: MachineSpecs = {
132
+ "system": platform.system(),
133
+ "distro": distro,
134
+ "home_dir": str(Path.home()),
135
+ }
136
+ print(specs)
137
+ from machineconfig.utils.source_of_truth import CONFIG_ROOT
138
+ path = CONFIG_ROOT.joinpath("machine_specs.json")
139
+ CONFIG_ROOT.mkdir(parents=True, exist_ok=True)
140
+ import json
141
+ path.write_text(json.dumps(specs, indent=4), encoding="utf-8")
142
+ return specs
@@ -1,6 +1,6 @@
1
1
 
2
2
 
3
- from machineconfig.scripts.python.helpers_devops.cli_utils import download, merge_pdfs
3
+ from machineconfig.scripts.python.helpers_devops.cli_utils import download, merge_pdfs, get_machine_specs
4
4
  import typer
5
5
 
6
6
 
@@ -11,6 +11,8 @@ def get_app() -> typer.Typer:
11
11
  app.command(name="d", no_args_is_help=True, hidden=True)(download)
12
12
  app.command(name="merge-pdfs", no_args_is_help=True, help="[m] Merge two PDF files into one.")(merge_pdfs)
13
13
  app.command(name="m", no_args_is_help=True, hidden=True)(merge_pdfs)
14
+ app.command(name="get-machine-specs", no_args_is_help=False, help="[g] Get machine specifications.")(get_machine_specs)
15
+ app.command(name="g", no_args_is_help=False, hidden=True)(get_machine_specs)
14
16
  return app
15
17
 
16
18
 
@@ -1,16 +1,16 @@
1
- from typing import Callable, Optional, Any, Union
1
+ from typing import Callable, Optional, Any, Union, cast
2
2
  import os
3
3
  from pathlib import Path
4
4
  import platform
5
+ from machineconfig.scripts.python.helpers_devops.cli_utils import MachineSpecs
5
6
  import rich.console
6
- from machineconfig.utils.terminal import Response, MACHINE
7
- from machineconfig.utils.accessories import pprint
8
-
7
+ from machineconfig.utils.terminal import Response
8
+ from machineconfig.utils.accessories import pprint, randstr
9
+ from machineconfig.utils.meta import lambda_to_python_script
9
10
  UV_RUN_CMD = "$HOME/.local/bin/uv run" if platform.system() != "Windows" else """& "$env:USERPROFILE/.local/bin/uv" run"""
10
11
  MACHINECONFIG_VERSION = "machineconfig>=6.61"
11
12
  DEFAULT_PICKLE_SUBDIR = "tmp_results/tmp_scripts/ssh"
12
13
 
13
-
14
14
  class SSH:
15
15
  def __init__(
16
16
  self, host: Optional[str], username: Optional[str], hostname: Optional[str], ssh_key_path: Optional[str], password: Optional[str], port: int, enable_compression: bool):
@@ -22,7 +22,6 @@ class SSH:
22
22
  self.username: str
23
23
  self.port: int = port
24
24
  self.proxycommand: Optional[str] = None
25
- import platform
26
25
  import paramiko # type: ignore
27
26
  import getpass
28
27
 
@@ -109,13 +108,16 @@ class SSH:
109
108
  def view_bar(self, transferred: int, total: int) -> None:
110
109
  if self.progress and self.task is not None:
111
110
  self.progress.update(self.task, completed=transferred, total=total)
112
-
113
111
  self.tqdm_wrap = RichProgressWrapper
114
- self._local_distro: Optional[str] = None
115
- self._remote_distro: Optional[str] = None
116
- self._remote_machine: Optional[MACHINE] = None
112
+ from machineconfig.scripts.python.helpers_devops.cli_utils import get_machine_specs
113
+ self.local_specs: MachineSpecs = get_machine_specs()
114
+ resp = self.run_shell(command=f"""~/.local/bin/utils get-machine-specs """, verbose_output=False, description="Getting remote machine specs", strict_stderr=False, strict_return_code=False)
115
+ # import json
116
+ json_str = resp.op
117
+ print(f"Remote machine specs JSON: {resp.op}")
118
+ import ast
119
+ self.remote_specs: MachineSpecs = cast(MachineSpecs, ast.literal_eval(json_str))
117
120
  self.terminal_responses: list[Response] = []
118
- self.platform = platform
119
121
 
120
122
  def __enter__(self) -> "SSH":
121
123
  return self
@@ -126,34 +128,11 @@ class SSH:
126
128
  self.sftp.close()
127
129
  self.sftp = None
128
130
  self.ssh.close()
129
- def get_remote_machine(self) -> MACHINE:
130
- if self._remote_machine is None:
131
- windows_test1 = self.run_shell(command="$env:OS", verbose_output=False, description="Testing Remote OS Type", strict_stderr=False, strict_return_code=False).op
132
- windows_test2 = self.run_shell(command="echo %OS%", verbose_output=False, description="Testing Remote OS Type Again", strict_stderr=False, strict_return_code=False).op
133
- if windows_test1 == "Windows_NT" or windows_test2 == "Windows_NT":
134
- self._remote_machine = "Windows"
135
- else:
136
- self._remote_machine = "Linux"
137
- return self._remote_machine
138
- def get_local_distro(self) -> str:
139
- if self._local_distro is None:
140
- command = f"""{UV_RUN_CMD} --with distro python -c "import distro; print(distro.name(pretty=True))" """
141
- import subprocess
142
- res = subprocess.run(command, shell=True, capture_output=True, text=True).stdout.strip()
143
- self._local_distro = res
144
- return res
145
- return self._local_distro
146
- def get_remote_distro(self) -> str:
147
- if self._remote_distro is None:
148
- command_str = f"""{UV_RUN_CMD} --with distro python -c "import distro; print(distro.name(pretty=True))" """
149
- res = self.run_shell(command=command_str, verbose_output=True, description="", strict_stderr=False, strict_return_code=False)
150
- self._remote_distro = res.op_if_successfull_or_default() or ""
151
- return self._remote_distro
152
131
  def restart_computer(self) -> Response:
153
- return self.run_shell(command="Restart-Computer -Force" if self.get_remote_machine() == "Windows" else "sudo reboot", verbose_output=True, description="", strict_stderr=False, strict_return_code=False)
132
+ return self.run_shell(command="Restart-Computer -Force" if self.remote_specs["system"] == "Windows" else "sudo reboot", verbose_output=True, description="", strict_stderr=False, strict_return_code=False)
154
133
  def send_ssh_key(self) -> Response:
155
- self.copy_from_here(source_path=Path("~/.ssh/id_rsa.pub"), target_path=None, compress_with_zip=False, recursive=False, overwrite_existing=False)
156
- if self.get_remote_machine() != "Windows":
134
+ self.copy_from_here(source_path="~/.ssh/id_rsa.pub", target_rel2home=None, compress_with_zip=False, recursive=False, overwrite_existing=False)
135
+ if self.remote_specs["system"] != "Windows":
157
136
  raise RuntimeError("send_ssh_key is only supported for Windows remote machines")
158
137
  code_url = "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/src/machineconfig/setup_windows/openssh-server_add-sshkey.ps1"
159
138
  import urllib.request
@@ -162,17 +141,17 @@ class SSH:
162
141
  return self.run_shell(command=code, verbose_output=True, description="", strict_stderr=False, strict_return_code=False)
163
142
 
164
143
  def get_remote_repr(self, add_machine: bool = False) -> str:
165
- return f"{self.username}@{self.hostname}:{self.port}" + (f" [{self.get_remote_machine()}][{self.get_remote_distro()}]" if add_machine else "")
144
+ return f"{self.username}@{self.hostname}:{self.port}" + (f" [{self.remote_specs['system']}][{self.remote_specs['distro']}]" if add_machine else "")
166
145
  def get_local_repr(self, add_machine: bool = False) -> str:
167
146
  import getpass
168
- return f"{getpass.getuser()}@{self.platform.node()}" + (f" [{self.platform.system()}][{self.get_local_distro()}]" if add_machine else "")
147
+ return f"{getpass.getuser()}@{platform.node()}" + (f" [{platform.system()}][{self.local_specs['distro']}]" if add_machine else "")
169
148
  def get_ssh_conn_str(self, command: str) -> str:
170
149
  return "ssh " + (f" -i {self.ssh_key_path}" if self.ssh_key_path else "") + self.get_remote_repr(add_machine=False).replace(":", " -p ") + (f" -t {command} " if command != "" else " ")
171
150
  def __repr__(self) -> str:
172
151
  return f"local {self.get_local_repr(add_machine=True)} >>> SSH TO >>> remote {self.get_remote_repr(add_machine=True)}"
173
152
 
174
153
  def run_locally(self, command: str) -> Response:
175
- print(f"""💻 [LOCAL EXECUTION] Running command on node: {self.platform.node()} Command: {command}""")
154
+ print(f"""💻 [LOCAL EXECUTION] Running command on node: {self.local_specs['system']} Command: {command}""")
176
155
  res = Response(cmd=command)
177
156
  res.output.returncode = os.system(command)
178
157
  return res
@@ -184,15 +163,14 @@ class SSH:
184
163
  res.print()
185
164
  else:
186
165
  res.capture().print_if_unsuccessful(desc=description, strict_err=strict_stderr, strict_returncode=strict_return_code, assert_success=False)
187
- self.terminal_responses.append(res)
166
+ # self.terminal_responses.append(res)
188
167
  return res
189
168
  def run_py(self, python_code: str, uv_with: Optional[list[str]], uv_project_dir: Optional[str],
190
169
  description: str, verbose_output: bool, strict_stderr: bool, strict_return_code: bool) -> Response:
191
- from machineconfig.utils.accessories import randstr
192
170
  py_path = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/runpy_{randstr()}.py")
193
171
  py_path.parent.mkdir(parents=True, exist_ok=True)
194
172
  py_path.write_text(python_code, encoding="utf-8")
195
- self.copy_from_here(source_path=py_path, target_path=None, compress_with_zip=False, recursive=False, overwrite_existing=False)
173
+ self.copy_from_here(source_path=str(py_path), target_rel2home=None, compress_with_zip=False, recursive=False, overwrite_existing=False)
196
174
  if uv_with is not None and len(uv_with) > 0:
197
175
  with_clause = " --with " + '"' + ",".join(uv_with) + '"'
198
176
  else:
@@ -204,8 +182,7 @@ class SSH:
204
182
  uv_cmd = f"""{UV_RUN_CMD} {with_clause} python {py_path.relative_to(Path.home())}"""
205
183
  return self.run_shell(command=uv_cmd, verbose_output=verbose_output, description=description or f"run_py on {self.get_remote_repr(add_machine=False)}", strict_stderr=strict_stderr, strict_return_code=strict_return_code)
206
184
 
207
- def run_py_func(self, func: Callable[..., Any], uv_with: Optional[list[str]], uv_project_dir: Optional[str]) -> Response:
208
- from machineconfig.utils.meta import lambda_to_python_script
185
+ def run_lambda_function(self, func: Callable[..., Any], uv_with: Optional[list[str]], uv_project_dir: Optional[str]) -> Response:
209
186
  command = lambda_to_python_script(lmb=func, in_global=True)
210
187
  return self.run_py(python_code=command, uv_with=uv_with, uv_project_dir=uv_project_dir,
211
188
  description=f"run_py_func {func.__name__} on {self.get_remote_repr(add_machine=False)}",
@@ -218,77 +195,47 @@ class SSH:
218
195
  local_path.parent.mkdir(parents=True, exist_ok=True)
219
196
  self.sftp.get(remotepath=remote_path, localpath=str(local_path))
220
197
 
221
- def _create_remote_target_dir(self, target_path: Union[str, Path], overwrite_existing: bool) -> str:
198
+ def create_dir(self, path_rel2home: str, overwrite_existing: bool) -> None:
222
199
  """Helper to create a directory on remote machine and return its path."""
223
- def create_target_dir(target_dir_path: str, overwrite: bool, json_output_path: str) -> str:
200
+ def create_target_dir(target_rel2home: str, overwrite: bool):
224
201
  from pathlib import Path
225
202
  import shutil
226
- import json
227
- directory_path = Path(target_dir_path).expanduser()
203
+ directory_path = Path(target_rel2home).expanduser()
228
204
  if overwrite and directory_path.exists():
229
205
  if directory_path.is_dir():
230
206
  shutil.rmtree(directory_path)
231
207
  else:
232
208
  directory_path.unlink()
233
209
  directory_path.parent.mkdir(parents=True, exist_ok=True)
234
- result_path_posix = directory_path.as_posix()
235
- json_result_path = Path(json_output_path)
236
- json_result_path.parent.mkdir(parents=True, exist_ok=True)
237
- json_result_path.write_text(json.dumps(result_path_posix, indent=2), encoding="utf-8")
238
- print(json_result_path.as_posix())
239
- return result_path_posix
240
- from machineconfig.utils.meta import lambda_to_python_script
241
- from machineconfig.utils.accessories import randstr
242
- remote_json_output = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/return_{randstr()}.json").as_posix()
243
- # command = function_to_script(func=create_target_dir, call_with_kwargs={"target_dir_path": Path(target_path).as_posix(), "overwrite": overwrite_existing, "json_output_path": remote_json_output})
244
- command = lambda_to_python_script(lmb=lambda: create_target_dir(target_dir_path=str(target_path), overwrite=overwrite_existing, json_output_path=remote_json_output), in_global=True)
245
- response = self.run_py(python_code=command, uv_with=[MACHINECONFIG_VERSION], uv_project_dir=None,
246
- description=f"Creating target directory `{Path(target_path).parent.as_posix()}` @ {self.get_remote_repr(add_machine=False)}",
247
- verbose_output=False, strict_stderr=False, strict_return_code=False)
248
- remote_json_path = response.op.strip()
249
- if not remote_json_path:
250
- raise RuntimeError(f"Failed to create target directory {target_path} - no response from remote")
251
- from machineconfig.utils.accessories import randstr
252
- local_json = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/local_{randstr()}.json")
253
- self._simple_sftp_get(remote_path=remote_json_path, local_path=local_json)
254
- import json
255
- try:
256
- result = json.loads(local_json.read_text(encoding="utf-8"))
257
- except (json.JSONDecodeError, FileNotFoundError) as err:
258
- raise RuntimeError(f"Failed to create target directory {target_path} - invalid JSON response: {err}") from err
259
- finally:
260
- if local_json.exists():
261
- local_json.unlink()
262
- assert isinstance(result, str), f"Failed to create target directory {target_path} on remote"
263
- return result
210
+ command = lambda_to_python_script(lmb=lambda: create_target_dir(target_rel2home=path_rel2home, overwrite=overwrite_existing), in_global=True)
211
+ tmp_py_file = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/create_target_dir_{randstr()}.py")
212
+ tmp_py_file.parent.mkdir(parents=True, exist_ok=True)
213
+ tmp_py_file.write_text(command, encoding="utf-8")
214
+ # self.copy_from_here(source_path=str(tmp_py_file), target_rel2home=".tmp_file.py", compress_with_zip=False, recursive=False, overwrite_existing=True)
215
+ assert self.sftp is not None
216
+ tmp_remote_path = ".tmp_pyfile.py"
217
+ self.sftp.put(localpath=str(tmp_py_file), remotepath=str(Path(self.remote_specs["home_dir"]).joinpath(tmp_remote_path)))
218
+ self.run_shell(command=f"""{UV_RUN_CMD} python {tmp_remote_path}""", verbose_output=False, description=f"Creating target dir {path_rel2home}", strict_stderr=True, strict_return_code=True)
264
219
 
265
-
266
- def copy_from_here(self, source_path: Union[str, Path], target_path: Optional[Union[str, Path]], compress_with_zip: bool, recursive: bool, overwrite_existing: bool) -> Path:
267
- if self.sftp is None:
268
- raise RuntimeError(f"SFTP connection not available for {self.hostname}. Cannot transfer files.")
269
-
220
+ def copy_from_here(self, source_path: str, target_rel2home: Optional[str], compress_with_zip: bool, recursive: bool, overwrite_existing: bool) -> None:
221
+ if self.sftp is None: raise RuntimeError(f"SFTP connection not available for {self.hostname}. Cannot transfer files.")
270
222
  source_obj = Path(source_path).expanduser().absolute()
271
- if not source_obj.exists():
272
- raise RuntimeError(f"SSH Error: source `{source_obj}` does not exist!")
273
-
274
- if target_path is None:
275
- try:
276
- target_path_relative = source_obj.relative_to(Path.home())
277
- target_path = Path("~") / target_path_relative
223
+ if not source_obj.exists(): raise RuntimeError(f"SSH Error: source `{source_obj}` does not exist!")
224
+ if target_rel2home is None:
225
+ try: target_rel2home = str(source_obj.relative_to(Path.home()))
278
226
  except ValueError:
279
227
  raise RuntimeError(f"If target is not specified, source must be relative to home directory, but got: {source_obj}")
280
-
281
228
  if not compress_with_zip and source_obj.is_dir():
282
229
  if not recursive:
283
230
  raise RuntimeError(f"SSH Error: source `{source_obj}` is a directory! Set `recursive=True` for recursive sending or `compress_with_zip=True` to zip it first.")
284
231
  file_paths_to_upload: list[Path] = [file_path for file_path in source_obj.rglob("*") if file_path.is_file()]
285
- remote_root = self._create_remote_target_dir(target_path=target_path, overwrite_existing=overwrite_existing)
232
+ self.create_dir(path_rel2home=target_rel2home, overwrite_existing=overwrite_existing)
286
233
  for idx, file_path in enumerate(file_paths_to_upload):
287
234
  print(f" {idx + 1:03d}. {file_path}")
288
235
  for file_path in file_paths_to_upload:
289
- remote_file_target = Path(remote_root).joinpath(file_path.relative_to(source_obj))
290
- self.copy_from_here(source_path=file_path, target_path=remote_file_target, compress_with_zip=False, recursive=False, overwrite_existing=overwrite_existing)
291
- return Path(remote_root)
236
+ remote_file_target = Path(target_rel2home).joinpath(file_path.relative_to(source_obj))
237
+ self.copy_from_here(source_path=str(file_path), target_rel2home=str(remote_file_target), compress_with_zip=False, recursive=False, overwrite_existing=overwrite_existing)
238
+ return None
292
239
  if compress_with_zip:
293
240
  print("🗜️ ZIPPING ...")
294
241
  import shutil
@@ -298,16 +245,14 @@ class SSH:
298
245
  else:
299
246
  shutil.make_archive(str(zip_path), "zip", source_obj.parent, source_obj.name)
300
247
  source_obj = Path(str(zip_path) + ".zip")
301
- if not str(target_path).endswith(".zip"):
302
- target_path = Path(str(target_path) + ".zip")
303
- remotepath_str = self._create_remote_target_dir(target_path=target_path, overwrite_existing=overwrite_existing)
304
- remotepath = Path(remotepath_str)
305
- print(f"""📤 [SFTP UPLOAD] Sending file: {repr(source_obj)} ==> Remote Path: {remotepath.as_posix()}""")
248
+ if not target_rel2home.endswith(".zip"): target_rel2home = target_rel2home + ".zip"
249
+ self.create_dir(path_rel2home=target_rel2home, overwrite_existing=overwrite_existing)
250
+ print(f"""📤 [SFTP UPLOAD] Sending file: {repr(source_obj)} ==> Remote Path: {target_rel2home}""")
306
251
  try:
307
252
  with self.tqdm_wrap(ascii=True, unit="b", unit_scale=True) as pbar:
308
253
  if self.sftp is None: # type: ignore[unreachable]
309
254
  raise RuntimeError(f"SFTP connection lost for {self.hostname}")
310
- self.sftp.put(localpath=str(source_obj), remotepath=remotepath.as_posix(), callback=pbar.view_bar) # type: ignore
255
+ self.sftp.put(localpath=str(source_obj), remotepath=str(Path(self.remote_specs["home_dir"]).joinpath(target_rel2home)), callback=pbar.view_bar)
311
256
  except Exception:
312
257
  if compress_with_zip and source_obj.exists() and str(source_obj).endswith("_archive.zip"):
313
258
  source_obj.unlink()
@@ -325,11 +270,14 @@ class SSH:
325
270
  with zipfile.ZipFile(archive_path, "r") as archive_handle:
326
271
  archive_handle.extractall(extraction_directory)
327
272
  archive_path.unlink()
328
- from machineconfig.utils.meta import lambda_to_python_script
329
- command = lambda_to_python_script(lmb=lambda: unzip_archive(zip_file_path=remotepath.as_posix(), overwrite_flag=overwrite_existing), in_global=True)
330
- _resp = self.run_py(python_code=command, uv_with=[MACHINECONFIG_VERSION], uv_project_dir=None, description=f"UNZIPPING {remotepath.as_posix()}", verbose_output=False, strict_stderr=True, strict_return_code=True)
273
+ command = lambda_to_python_script(lmb=lambda: unzip_archive(zip_file_path=str(Path(self.remote_specs["home_dir"]).joinpath(target_rel2home)), overwrite_flag=overwrite_existing), in_global=True)
274
+ tmp_py_file = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/create_target_dir_{randstr()}.py")
275
+ tmp_py_file.parent.mkdir(parents=True, exist_ok=True)
276
+ tmp_py_file.write_text(command, encoding="utf-8")
277
+ transferred_py_file = self.copy_from_here(source_path=str(tmp_py_file), target_rel2home=None, compress_with_zip=True, recursive=False, overwrite_existing=True)
278
+ self.run_shell(command=f"""{UV_RUN_CMD} python {transferred_py_file}""", verbose_output=False, description=f"UNZIPPING {target_rel2home}", strict_stderr=True, strict_return_code=True)
331
279
  source_obj.unlink()
332
- return source_obj
280
+ return None
333
281
 
334
282
  def _check_remote_is_dir(self, source_path: Union[str, Path]) -> bool:
335
283
  """Helper to check if a remote path is a directory."""
@@ -342,16 +290,13 @@ class SSH:
342
290
  json_result_path.write_text(json.dumps(is_directory, indent=2), encoding="utf-8")
343
291
  print(json_result_path.as_posix())
344
292
  return is_directory
345
-
346
- from machineconfig.utils.meta import lambda_to_python_script
347
- from machineconfig.utils.accessories import randstr
348
293
  remote_json_output = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/return_{randstr()}.json").as_posix()
349
294
  command = lambda_to_python_script(lmb=lambda: check_is_dir(path_to_check=str(source_path), json_output_path=remote_json_output), in_global=True)
350
295
  response = self.run_py(python_code=command, uv_with=[MACHINECONFIG_VERSION], uv_project_dir=None, description=f"Check if source `{source_path}` is a dir", verbose_output=False, strict_stderr=False, strict_return_code=False)
351
296
  remote_json_path = response.op.strip()
352
297
  if not remote_json_path:
353
298
  raise RuntimeError(f"Failed to check if {source_path} is directory - no response from remote")
354
- from machineconfig.utils.accessories import randstr
299
+
355
300
  local_json = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/local_{randstr()}.json")
356
301
  self._simple_sftp_get(remote_path=remote_json_path, local_path=local_json)
357
302
  import json
@@ -377,15 +322,15 @@ class SSH:
377
322
  print(json_result_path.as_posix())
378
323
  return expanded_path_posix
379
324
 
380
- from machineconfig.utils.meta import lambda_to_python_script
381
- from machineconfig.utils.accessories import randstr
325
+
326
+
382
327
  remote_json_output = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/return_{randstr()}.json").as_posix()
383
328
  command = lambda_to_python_script(lmb=lambda: expand_source(path_to_expand=str(source_path), json_output_path=remote_json_output), in_global=True)
384
329
  response = self.run_py(python_code=command, uv_with=[MACHINECONFIG_VERSION], uv_project_dir=None, description="Resolving source path by expanding user", verbose_output=False, strict_stderr=False, strict_return_code=False)
385
330
  remote_json_path = response.op.strip()
386
331
  if not remote_json_path:
387
332
  raise RuntimeError(f"Could not resolve source path {source_path} - no response from remote")
388
- from machineconfig.utils.accessories import randstr
333
+
389
334
  local_json = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/local_{randstr()}.json")
390
335
  self._simple_sftp_get(remote_path=remote_json_path, local_path=local_json)
391
336
  import json
@@ -426,15 +371,15 @@ class SSH:
426
371
  print(json_result_path.as_posix())
427
372
  return file_paths_list
428
373
 
429
- from machineconfig.utils.meta import lambda_to_python_script
430
- from machineconfig.utils.accessories import randstr
374
+
375
+
431
376
  remote_json_output = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/return_{randstr()}.json").as_posix()
432
377
  command = lambda_to_python_script(lmb=lambda: search_files(directory_path=expanded_source, json_output_path=remote_json_output), in_global=True)
433
378
  response = self.run_py(python_code=command, uv_with=[MACHINECONFIG_VERSION], uv_project_dir=None, description="Searching for files in source", verbose_output=False, strict_stderr=False, strict_return_code=False)
434
379
  remote_json_path = response.op.strip()
435
380
  if not remote_json_path:
436
381
  raise RuntimeError(f"Could not resolve source path {source} - no response from remote")
437
- from machineconfig.utils.accessories import randstr
382
+
438
383
  local_json = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/local_{randstr()}.json")
439
384
  self._simple_sftp_get(remote_path=remote_json_path, local_path=local_json)
440
385
  import json
@@ -464,15 +409,15 @@ class SSH:
464
409
  except ValueError:
465
410
  raise RuntimeError(f"Source path must be relative to home directory: {source_absolute_path}")
466
411
 
467
- from machineconfig.utils.meta import lambda_to_python_script
468
- from machineconfig.utils.accessories import randstr
412
+
413
+
469
414
  remote_json_output = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/return_{randstr()}.json").as_posix()
470
415
  command = lambda_to_python_script(lmb=lambda: collapse_to_home_dir(absolute_path=expanded_source, json_output_path=remote_json_output), in_global=True)
471
416
  response = self.run_py(python_code=command, uv_with=[MACHINECONFIG_VERSION], uv_project_dir=None, description="Finding default target via relative source path", verbose_output=False, strict_stderr=False, strict_return_code=False)
472
417
  remote_json_path_dir = response.op.strip()
473
418
  if not remote_json_path_dir:
474
419
  raise RuntimeError("Could not resolve target path - no response from remote")
475
- from machineconfig.utils.accessories import randstr
420
+
476
421
  local_json_dir = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/local_{randstr()}.json")
477
422
  self._simple_sftp_get(remote_path=remote_json_path_dir, local_path=local_json_dir)
478
423
  import json
@@ -516,15 +461,15 @@ class SSH:
516
461
  print(json_result_path.as_posix())
517
462
  return zip_file_path
518
463
 
519
- from machineconfig.utils.meta import lambda_to_python_script
520
- from machineconfig.utils.accessories import randstr
464
+
465
+
521
466
  remote_json_output = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/return_{randstr()}.json").as_posix()
522
467
  command = lambda_to_python_script(lmb=lambda: zip_source(path_to_zip=expanded_source, json_output_path=remote_json_output), in_global=True)
523
468
  response = self.run_py(python_code=command, uv_with=[MACHINECONFIG_VERSION], uv_project_dir=None, description=f"Zipping source file {source}", verbose_output=False, strict_stderr=False, strict_return_code=False)
524
469
  remote_json_path = response.op.strip()
525
470
  if not remote_json_path:
526
471
  raise RuntimeError(f"Could not zip {source} - no response from remote")
527
- from machineconfig.utils.accessories import randstr
472
+
528
473
  local_json = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/local_{randstr()}.json")
529
474
  self._simple_sftp_get(remote_path=remote_json_path, local_path=local_json)
530
475
  import json
@@ -555,15 +500,15 @@ class SSH:
555
500
  except ValueError:
556
501
  raise RuntimeError(f"Source path must be relative to home directory: {source_absolute_path}")
557
502
 
558
- from machineconfig.utils.meta import lambda_to_python_script
559
- from machineconfig.utils.accessories import randstr
503
+
504
+
560
505
  remote_json_output = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/return_{randstr()}.json").as_posix()
561
506
  command = lambda_to_python_script(lmb=lambda: collapse_to_home(absolute_path=expanded_source, json_output_path=remote_json_output), in_global=True)
562
507
  response = self.run_py(python_code=command, uv_with=[MACHINECONFIG_VERSION], uv_project_dir=None, description="Finding default target via relative source path", verbose_output=False, strict_stderr=False, strict_return_code=False)
563
508
  remote_json_path = response.op.strip()
564
509
  if not remote_json_path:
565
510
  raise RuntimeError("Could not resolve target path - no response from remote")
566
- from machineconfig.utils.accessories import randstr
511
+
567
512
  local_json = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/local_{randstr()}.json")
568
513
  self._simple_sftp_get(remote_path=remote_json_path, local_path=local_json)
569
514
  import json
@@ -613,10 +558,12 @@ class SSH:
613
558
  else:
614
559
  file_or_dir_path.unlink()
615
560
 
616
- from machineconfig.utils.meta import lambda_to_python_script
561
+
617
562
  command = lambda_to_python_script(lmb=lambda: delete_temp_zip(path_to_delete=expanded_source), in_global=True)
618
563
  self.run_py(python_code=command, uv_with=[MACHINECONFIG_VERSION], uv_project_dir=None, description="Cleaning temp zip files @ remote.", verbose_output=False, strict_stderr=True, strict_return_code=True)
619
564
 
620
565
  print("\n")
621
566
  return target_obj
622
567
 
568
+ if __name__ == "__main__":
569
+ ssh = SSH(host="p51s", username=None, hostname=None, ssh_key_path=None, password=None, port=22, enable_compression=False)
@@ -0,0 +1,100 @@
1
+ from machineconfig.utils.path_extended import PathExtended
2
+ import subprocess
3
+ from typing import Any, BinaryIO, Optional, Union
4
+ from typing import Literal, TypeAlias
5
+ from dataclasses import dataclass
6
+
7
+ SHELLS: TypeAlias = Literal["default", "cmd", "powershell", "pwsh", "bash"] # pwsh.exe is PowerShell (community) and powershell.exe is Windows Powershell (msft)
8
+ CONSOLE: TypeAlias = Literal["wt", "cmd"]
9
+ MACHINE: TypeAlias = Literal["Windows", "Linux", "Darwin"]
10
+
11
+
12
+ @dataclass
13
+ class STD:
14
+ stdin: str
15
+ stdout: str
16
+ stderr: str
17
+ returncode: int
18
+
19
+
20
+ class Response:
21
+ @staticmethod
22
+ def from_completed_process(cp: subprocess.CompletedProcess[str]):
23
+ resp = Response(cmd=cp.args)
24
+ resp.output.stdout = cp.stdout
25
+ resp.output.stderr = cp.stderr
26
+ resp.output.returncode = cp.returncode
27
+ return resp
28
+
29
+ def __init__(self, stdin: Optional[BinaryIO] = None, stdout: Optional[BinaryIO] = None, stderr: Optional[BinaryIO] = None, cmd: Optional[str] = None, desc: str = ""):
30
+ self.std = dict(stdin=stdin, stdout=stdout, stderr=stderr)
31
+ self.output = STD(stdin="", stdout="", stderr="", returncode=0)
32
+ self.input = cmd
33
+ self.desc = desc # input command
34
+
35
+ def __call__(self, *args: Any, **kwargs: Any) -> Optional[str]:
36
+ _ = args, kwargs
37
+ return self.op.rstrip() if type(self.op) is str else None
38
+ def __repr__(self) -> str:
39
+ return f"Response({self.input=}, {self.output=}, {self.desc=}, {self.op=}, {self.ip=}, {self.err=}, {self.returncode=})"
40
+ @property
41
+ def op(self) -> str:
42
+ return self.output.stdout
43
+
44
+ @property
45
+ def ip(self) -> str:
46
+ return self.output.stdin
47
+
48
+ @property
49
+ def err(self) -> str:
50
+ return self.output.stderr
51
+
52
+ @property
53
+ def returncode(self) -> int:
54
+ return self.output.returncode
55
+
56
+ def op2path(self, strict_returncode: bool = True, strict_err: bool = False) -> Union[PathExtended, None]:
57
+ if self.is_successful(strict_returcode=strict_returncode, strict_err=strict_err):
58
+ return PathExtended(self.op.rstrip())
59
+ return None
60
+
61
+ def op_if_successfull_or_default(self, strict_returcode: bool = True, strict_err: bool = False) -> Optional[str]:
62
+ return self.op if self.is_successful(strict_returcode=strict_returcode, strict_err=strict_err) else None
63
+
64
+ def is_successful(self, strict_returcode: bool = True, strict_err: bool = False) -> bool:
65
+ return ((self.returncode in {0, None}) if strict_returcode else True) and (self.err == "" if strict_err else True)
66
+
67
+ def capture(self):
68
+ for key in ["stdin", "stdout", "stderr"]:
69
+ val: Optional[BinaryIO] = self.std[key]
70
+ if val is not None and val.readable():
71
+ self.output.__dict__[key] = val.read().decode().rstrip()
72
+ return self
73
+
74
+ def print_if_unsuccessful(self, desc: str = "TERMINAL CMD", strict_err: bool = False, strict_returncode: bool = False, assert_success: bool = False):
75
+ success = self.is_successful(strict_err=strict_err, strict_returcode=strict_returncode)
76
+ if assert_success:
77
+ assert success, self.print(capture=False, desc=desc)
78
+ if success:
79
+ print(f"✅ {desc} completed successfully")
80
+ else:
81
+ self.print(capture=False, desc=desc)
82
+ return self
83
+
84
+ def print(self, desc: str = "TERMINAL CMD", capture: bool = True):
85
+ if capture:
86
+ self.capture()
87
+ from rich import console
88
+
89
+ con = console.Console()
90
+ from rich.panel import Panel
91
+ from rich.text import Text # from rich.syntax import Syntax; syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True)
92
+
93
+ tmp1 = Text("📥 Input Command:\n")
94
+ tmp1.stylize("u bold blue")
95
+ tmp2 = Text("\n📤 Terminal Response:\n")
96
+ tmp2.stylize("u bold blue")
97
+ list_str = [f"{f' {idx} - {key} '}".center(40, "═") + f"\n{val}" for idx, (key, val) in enumerate(self.output.__dict__.items())]
98
+ txt = tmp1 + Text(str(self.input), style="white") + tmp2 + Text("\n".join(list_str), style="white")
99
+ con.print(Panel(txt, title=f"🖥️ {self.desc}", subtitle=f"📋 {desc}", width=150, style="bold cyan on black"))
100
+ return self
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: machineconfig
3
- Version: 6.61
3
+ Version: 6.63
4
4
  Summary: Dotfiles management package
5
5
  Author-email: Alex Al-Saffar <programmer@usa.com>
6
6
  License: Apache 2.0