machineconfig 3.99__py3-none-any.whl → 7.66__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (418) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/distribute.py +0 -1
  3. machineconfig/cluster/remote/file_manager.py +0 -2
  4. machineconfig/cluster/remote/script_execution.py +1 -2
  5. machineconfig/cluster/sessions_managers/{enhanced_command_runner.py → helpers/enhanced_command_runner.py} +4 -6
  6. machineconfig/cluster/sessions_managers/helpers/load_balancer_helper.py +145 -0
  7. machineconfig/cluster/sessions_managers/utils/load_balancer.py +53 -0
  8. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  9. machineconfig/cluster/sessions_managers/wt_local.py +128 -330
  10. machineconfig/cluster/sessions_managers/wt_local_manager.py +53 -187
  11. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  12. machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
  13. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  14. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  17. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  18. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  19. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  20. machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -172
  21. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  22. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
  23. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  24. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  25. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  26. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  30. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  31. machineconfig/jobs/{python → installer}/check_installations.py +2 -16
  32. machineconfig/jobs/installer/custom/boxes.py +61 -0
  33. machineconfig/jobs/installer/custom/gh.py +69 -53
  34. machineconfig/jobs/installer/custom/hx.py +77 -20
  35. machineconfig/jobs/installer/custom_dev/alacritty.py +45 -30
  36. machineconfig/jobs/installer/custom_dev/brave.py +43 -35
  37. machineconfig/jobs/installer/custom_dev/bypass_paywall.py +31 -20
  38. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  39. machineconfig/jobs/installer/custom_dev/code.py +33 -21
  40. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  41. machineconfig/jobs/installer/custom_dev/espanso.py +64 -41
  42. machineconfig/jobs/installer/custom_dev/goes.py +41 -36
  43. machineconfig/jobs/installer/custom_dev/lvim.py +49 -33
  44. machineconfig/jobs/installer/custom_dev/nerdfont.py +71 -47
  45. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +32 -26
  46. machineconfig/jobs/installer/custom_dev/redis.py +51 -33
  47. machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
  48. machineconfig/jobs/installer/custom_dev/wezterm.py +55 -39
  49. machineconfig/jobs/installer/custom_dev/winget.py +1 -0
  50. machineconfig/jobs/installer/installer_data.json +3406 -0
  51. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  52. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  53. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  54. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  55. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  56. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  57. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  58. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  59. machineconfig/jobs/installer/linux_scripts/ngrok.sh +6 -0
  60. machineconfig/jobs/installer/linux_scripts/q.sh +9 -0
  61. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  62. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  63. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  64. machineconfig/jobs/installer/package_groups.py +255 -0
  65. machineconfig/logger.py +0 -1
  66. machineconfig/profile/backup.toml +49 -0
  67. machineconfig/profile/bash_shell_profiles.md +11 -0
  68. machineconfig/profile/create_helper.py +74 -0
  69. machineconfig/profile/create_links.py +288 -0
  70. machineconfig/profile/create_links_export.py +100 -0
  71. machineconfig/profile/create_shell_profile.py +136 -0
  72. machineconfig/profile/mapper.toml +258 -0
  73. machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
  74. machineconfig/scripts/__init__.py +0 -4
  75. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  76. machineconfig/scripts/linux/wrap_mcfg +47 -0
  77. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  78. machineconfig/scripts/python/agents.py +198 -0
  79. machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
  80. machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
  81. machineconfig/scripts/python/ai/generate_files.py +307 -42
  82. machineconfig/scripts/python/ai/initai.py +3 -28
  83. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  84. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  85. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  86. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +1 -1
  87. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  88. machineconfig/scripts/python/ai/solutions/generic.py +27 -4
  89. machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
  90. machineconfig/scripts/python/cloud.py +29 -0
  91. machineconfig/scripts/python/croshell.py +117 -181
  92. machineconfig/scripts/python/define.py +31 -0
  93. machineconfig/scripts/python/devops.py +44 -124
  94. machineconfig/scripts/python/devops_navigator.py +10 -0
  95. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  96. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  97. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  98. machineconfig/scripts/python/explore.py +49 -0
  99. machineconfig/scripts/python/fire_jobs.py +106 -244
  100. machineconfig/scripts/python/ftpx.py +125 -68
  101. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  102. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
  103. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  104. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
  105. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  106. machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +110 -0
  107. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
  108. machineconfig/scripts/python/helpers_agents/fire_agents_load_balancer.py +22 -0
  109. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
  110. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  111. machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
  112. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  113. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +11 -19
  114. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  115. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +3 -3
  116. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  117. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +17 -7
  118. machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
  119. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  120. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  121. machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
  122. machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
  123. machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
  124. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  125. machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
  126. machineconfig/scripts/python/helpers_devops/cli_terminal.py +156 -0
  127. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  128. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  129. machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
  130. machineconfig/scripts/python/helpers_devops/devops_update_repos.py +269 -0
  131. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  132. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  133. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
  134. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  135. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -87
  136. machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +145 -0
  137. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +110 -0
  138. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  139. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  140. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
  141. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
  142. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
  143. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  144. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  145. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  146. machineconfig/scripts/python/helpers_navigator/command_tree.py +588 -0
  147. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  148. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  149. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  150. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  151. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  152. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +6 -7
  153. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  154. machineconfig/scripts/python/helpers_repos/count_lines.py +348 -0
  155. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
  156. machineconfig/scripts/python/helpers_repos/entrypoint.py +77 -0
  157. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  158. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +7 -4
  159. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  160. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  161. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  162. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
  163. machineconfig/scripts/python/helpers_utils/download.py +152 -0
  164. machineconfig/scripts/python/helpers_utils/path.py +108 -0
  165. machineconfig/scripts/python/interactive.py +79 -160
  166. machineconfig/scripts/python/machineconfig.py +63 -0
  167. machineconfig/scripts/python/msearch.py +21 -0
  168. machineconfig/scripts/python/nw/__init__.py +0 -0
  169. machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +1 -3
  170. machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +74 -44
  171. machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
  172. machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +19 -16
  173. machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
  174. machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +7 -8
  175. machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
  176. machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
  177. machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
  178. machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
  179. machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +6 -5
  180. machineconfig/scripts/python/sessions.py +167 -0
  181. machineconfig/scripts/python/terminal.py +127 -0
  182. machineconfig/scripts/python/utils.py +66 -0
  183. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  184. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  185. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  186. machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
  187. machineconfig/settings/broot/br.sh +0 -4
  188. machineconfig/settings/broot/conf.toml +1 -1
  189. machineconfig/settings/helix/config.toml +16 -0
  190. machineconfig/settings/helix/languages.toml +13 -4
  191. machineconfig/settings/helix/yazi-picker.sh +12 -0
  192. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  193. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  194. machineconfig/settings/lf/linux/lfrc +10 -12
  195. machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
  196. machineconfig/settings/lf/windows/lfrc +18 -38
  197. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  198. machineconfig/settings/linters/.ruff.toml +1 -1
  199. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  200. machineconfig/settings/marimo/marimo.toml +80 -0
  201. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  202. machineconfig/settings/pistol/pistol.conf +1 -1
  203. machineconfig/settings/shells/bash/init.sh +55 -31
  204. machineconfig/settings/shells/nushell/config.nu +1 -34
  205. machineconfig/settings/shells/nushell/init.nu +127 -0
  206. machineconfig/settings/shells/pwsh/init.ps1 +60 -43
  207. machineconfig/settings/shells/starship/starship.toml +16 -0
  208. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  209. machineconfig/settings/shells/wt/settings.json +32 -17
  210. machineconfig/settings/shells/zsh/init.sh +89 -0
  211. machineconfig/settings/svim/linux/init.toml +0 -4
  212. machineconfig/settings/svim/windows/init.toml +0 -3
  213. machineconfig/settings/yazi/init.lua +57 -0
  214. machineconfig/settings/yazi/keymap_linux.toml +79 -0
  215. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  216. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  217. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  218. machineconfig/settings/yazi/yazi.toml +13 -0
  219. machineconfig/setup_linux/__init__.py +10 -0
  220. machineconfig/setup_linux/apps_desktop.sh +89 -0
  221. machineconfig/setup_linux/apps_gui.sh +64 -0
  222. machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
  223. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  224. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  225. machineconfig/setup_linux/uv.sh +15 -0
  226. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  227. machineconfig/setup_mac/__init__.py +16 -0
  228. machineconfig/setup_mac/apps_gui.sh +248 -0
  229. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  230. machineconfig/setup_mac/uv.sh +36 -0
  231. machineconfig/setup_windows/__init__.py +8 -0
  232. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  233. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  234. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  235. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  236. machineconfig/setup_windows/uv.ps1 +10 -0
  237. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -9
  238. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
  239. machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +37 -23
  240. machineconfig/utils/accessories.py +7 -5
  241. machineconfig/utils/cloud/onedrive/README.md +139 -0
  242. machineconfig/utils/code.py +140 -93
  243. machineconfig/utils/files/art/fat_croco.txt +10 -0
  244. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  245. machineconfig/utils/files/art/happy_croco.txt +22 -0
  246. machineconfig/utils/files/art/water_croco.txt +11 -0
  247. machineconfig/utils/files/ascii_art.py +118 -0
  248. machineconfig/utils/files/dbms.py +257 -0
  249. machineconfig/utils/files/headers.py +68 -0
  250. machineconfig/utils/files/ouch/__init__.py +0 -0
  251. machineconfig/utils/files/ouch/decompress.py +45 -0
  252. machineconfig/utils/files/read.py +95 -0
  253. machineconfig/utils/installer_utils/github_release_bulk.py +2 -12
  254. machineconfig/utils/installer_utils/installer_class.py +68 -126
  255. machineconfig/utils/installer_utils/installer_cli.py +181 -0
  256. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +38 -85
  257. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +69 -69
  258. machineconfig/utils/io.py +77 -23
  259. machineconfig/utils/links.py +309 -100
  260. machineconfig/utils/meta.py +255 -0
  261. machineconfig/utils/notifications.py +1 -1
  262. machineconfig/utils/options.py +10 -25
  263. machineconfig/utils/path_extended.py +94 -104
  264. machineconfig/utils/path_helper.py +75 -22
  265. machineconfig/utils/procs.py +50 -74
  266. machineconfig/utils/scheduler.py +94 -97
  267. machineconfig/utils/scheduling.py +0 -3
  268. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +5 -17
  269. machineconfig/utils/schemas/installer/installer_types.py +0 -1
  270. machineconfig/utils/schemas/layouts/layout_types.py +2 -1
  271. machineconfig/utils/source_of_truth.py +3 -6
  272. machineconfig/utils/ssh.py +742 -254
  273. machineconfig/utils/ssh_utils/utils.py +0 -0
  274. machineconfig/utils/terminal.py +3 -140
  275. machineconfig/utils/tst.py +20 -0
  276. machineconfig/utils/upgrade_packages.py +109 -28
  277. machineconfig/utils/ve.py +13 -5
  278. machineconfig-7.66.dist-info/METADATA +124 -0
  279. machineconfig-7.66.dist-info/RECORD +451 -0
  280. machineconfig-7.66.dist-info/entry_points.txt +15 -0
  281. machineconfig/cluster/templates/utils.py +0 -51
  282. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  283. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  284. machineconfig/jobs/installer/packages_custom_dev.json +0 -226
  285. machineconfig/jobs/installer/packages_custom_essential.json +0 -39
  286. machineconfig/jobs/installer/packages_github_dev.json +0 -1110
  287. machineconfig/jobs/installer/packages_github_essential.json +0 -804
  288. machineconfig/jobs/linux/msc/cli_agents.sh +0 -37
  289. machineconfig/jobs/python/create_bootable_media.py +0 -16
  290. machineconfig/jobs/python/python_cargo_build_share.py +0 -59
  291. machineconfig/jobs/python/python_ve_symlink.py +0 -29
  292. machineconfig/jobs/python/tasks.py +0 -3
  293. machineconfig/jobs/python/vscode/api.py +0 -49
  294. machineconfig/jobs/python/vscode/sync_code.py +0 -58
  295. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  296. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  297. machineconfig/jobs/windows/startup_file.cmd +0 -2
  298. machineconfig/profile/create.py +0 -170
  299. machineconfig/profile/shell.py +0 -176
  300. machineconfig/scripts/cloud/init.sh +0 -119
  301. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  302. machineconfig/scripts/linux/cloud_copy +0 -2
  303. machineconfig/scripts/linux/cloud_mount +0 -2
  304. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  305. machineconfig/scripts/linux/cloud_sync +0 -2
  306. machineconfig/scripts/linux/croshell +0 -3
  307. machineconfig/scripts/linux/devops +0 -2
  308. machineconfig/scripts/linux/fire +0 -2
  309. machineconfig/scripts/linux/fire_agents +0 -2
  310. machineconfig/scripts/linux/ftpx +0 -2
  311. machineconfig/scripts/linux/fzf2g +0 -21
  312. machineconfig/scripts/linux/fzffg +0 -25
  313. machineconfig/scripts/linux/gh_models +0 -2
  314. machineconfig/scripts/linux/initai +0 -2
  315. machineconfig/scripts/linux/kill_process +0 -2
  316. machineconfig/scripts/linux/programs +0 -21
  317. machineconfig/scripts/linux/repos +0 -2
  318. machineconfig/scripts/linux/scheduler +0 -2
  319. machineconfig/scripts/linux/share_smb +0 -1
  320. machineconfig/scripts/linux/start_slidev +0 -2
  321. machineconfig/scripts/linux/start_terminals +0 -3
  322. machineconfig/scripts/linux/warp-cli.sh +0 -122
  323. machineconfig/scripts/linux/wifi_conn +0 -2
  324. machineconfig/scripts/linux/z_ls +0 -104
  325. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  326. machineconfig/scripts/python/cloud_repo_sync.py +0 -186
  327. machineconfig/scripts/python/devops_devapps_install.py +0 -159
  328. machineconfig/scripts/python/devops_update_repos.py +0 -180
  329. machineconfig/scripts/python/dotfile.py +0 -52
  330. machineconfig/scripts/python/fire_agents.py +0 -175
  331. machineconfig/scripts/python/fire_agents_help_launch.py +0 -143
  332. machineconfig/scripts/python/fire_agents_load_balancer.py +0 -50
  333. machineconfig/scripts/python/fire_jobs_args_helper.py +0 -75
  334. machineconfig/scripts/python/fire_jobs_layout_helper.py +0 -74
  335. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  336. machineconfig/scripts/python/gh_models.py +0 -104
  337. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -114
  338. machineconfig/scripts/python/repos.py +0 -80
  339. machineconfig/scripts/python/repos_helper_action.py +0 -335
  340. machineconfig/scripts/python/share_terminal.py +0 -104
  341. machineconfig/scripts/python/snapshot.py +0 -25
  342. machineconfig/scripts/python/start_terminals.py +0 -121
  343. machineconfig/scripts/python/t4.py +0 -17
  344. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  345. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  346. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  347. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  348. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  349. machineconfig/scripts/windows/croshell.ps1 +0 -1
  350. machineconfig/scripts/windows/devops.ps1 +0 -1
  351. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  352. machineconfig/scripts/windows/fire.ps1 +0 -1
  353. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  354. machineconfig/scripts/windows/gpt.ps1 +0 -1
  355. machineconfig/scripts/windows/grep.ps1 +0 -2
  356. machineconfig/scripts/windows/initai.ps1 +0 -1
  357. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  358. machineconfig/scripts/windows/nano.ps1 +0 -3
  359. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  360. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  361. machineconfig/scripts/windows/repos.ps1 +0 -1
  362. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  363. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  364. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  365. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  366. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  367. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  368. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  369. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  370. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  371. machineconfig/setup_linux/web_shortcuts/ascii_art.sh +0 -93
  372. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  373. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  374. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  375. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  376. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  377. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  378. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  379. machineconfig-3.99.dist-info/METADATA +0 -167
  380. machineconfig-3.99.dist-info/RECORD +0 -409
  381. machineconfig-3.99.dist-info/entry_points.txt +0 -18
  382. machineconfig/cluster/{templates → remote}/run_cloud.py +0 -0
  383. machineconfig/cluster/{templates → remote}/run_cluster.py +0 -0
  384. machineconfig/cluster/{templates → remote}/run_remote.py +0 -0
  385. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  386. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  387. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  388. machineconfig/{jobs/python → scripts/python/helpers_agents}/__init__.py +0 -0
  389. machineconfig/scripts/python/{helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  390. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  391. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_cloud/__init__.py} +0 -0
  392. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  393. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  394. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_croshell/__init__.py} +0 -0
  395. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  396. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  397. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  398. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  399. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
  400. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/themes/__init__.py} +0 -0
  401. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  402. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  403. /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
  404. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
  405. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
  406. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
  407. /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
  408. /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
  409. /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
  410. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  411. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  412. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  413. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  414. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  415. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  416. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  417. {machineconfig-3.99.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
  418. {machineconfig-3.99.dist-info → machineconfig-7.66.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env -S uv run --no-dev --project /home/alex/code/machineconfig --script
2
1
  """Sx & Rx
3
2
 
4
3
  TODO: add support for cases in which source or target has non 22 default port number and is defineda as user@host:port:path which makes 2 colons in the string.
@@ -7,25 +6,41 @@ Currently, the only way to work around this is to predifine the host in ~/.ssh/c
7
6
  """
8
7
 
9
8
  import typer
10
- from typing_extensions import Annotated
11
- from machineconfig.utils.ssh import SSH
12
- from machineconfig.utils.path_extended import PathExtended as PathExtended
13
- from machineconfig.scripts.python.helpers.helpers2 import ES
14
- from machineconfig.utils.accessories import pprint
9
+ from typing import Annotated
15
10
 
16
11
 
17
- def main(
12
+ def ftpx(
18
13
  source: Annotated[str, typer.Argument(help="Source path (machine:path)")],
19
14
  target: Annotated[str, typer.Argument(help="Target path (machine:path)")],
20
15
  recursive: Annotated[bool, typer.Option("--recursive", "-r", help="Send recursively.")] = False,
21
16
  zipFirst: Annotated[bool, typer.Option("--zipFirst", "-z", help="Zip before sending.")] = False,
22
17
  cloud: Annotated[bool, typer.Option("--cloud", "-c", help="Transfer through the cloud.")] = False,
23
18
  ) -> None:
24
- print("""
25
- ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
26
- 🚀 FTP File Transfer
27
- ┃ 📋 Starting transfer process...
28
- ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""")
19
+
20
+ from rich.console import Console
21
+ from rich.panel import Panel
22
+
23
+ from machineconfig.utils.ssh import SSH
24
+ from machineconfig.utils.path_extended import PathExtended
25
+ from machineconfig.scripts.python.helpers_cloud.helpers2 import ES
26
+ from machineconfig.utils.accessories import pprint
27
+
28
+
29
+ console = Console()
30
+
31
+ console.print(
32
+ Panel(
33
+ "\n".join(
34
+ [
35
+ "🚀 FTP File Transfer",
36
+ "📋 Starting transfer process...",
37
+ ]
38
+ ),
39
+ title="Transfer Initialisation",
40
+ border_style="blue",
41
+ padding=(1, 2),
42
+ )
43
+ )
29
44
 
30
45
  # Initialize variables
31
46
  resolved_source: str | None = None
@@ -92,77 +107,119 @@ def main(
92
107
  from paramiko.ssh_exception import AuthenticationException # type: ignore
93
108
 
94
109
  try:
95
- ssh = SSH(rf"{machine}")
110
+ ssh = SSH(host=rf"{machine}", username=None, hostname=None, ssh_key_path=None, password=None, port=22, enable_compression=True)
96
111
  except AuthenticationException:
97
- print("""
98
- ┌────────────────────────────────────────────────────────────────
99
- │ 🔑 Authentication Failed
100
- │ Trying manual authentication...
101
-
102
- ⚠️ Caution: Ensure that username is passed appropriately
103
- │ This exception only handles password authentication
104
- └────────────────────────────────────────────────────────────────""")
112
+ console.print(
113
+ Panel(
114
+ "\n".join(
115
+ [
116
+ "🔑 Authentication failed. Trying manual authentication...",
117
+ "⚠️ Ensure that the username is provided correctly; only password prompts are handled here.",
118
+ ]
119
+ ),
120
+ title="Authentication Required",
121
+ border_style="yellow",
122
+ padding=(1, 2),
123
+ )
124
+ )
105
125
  import getpass
106
126
 
107
127
  pwd = getpass.getpass()
108
- ssh = SSH(rf"{machine}", pwd=pwd)
128
+ ssh = SSH(host=rf"{machine}", username=None, hostname=None, ssh_key_path=None, password=pwd, port=22, enable_compression=True)
109
129
 
110
130
  if cloud:
111
- print("""
112
- ┌────────────────────────────────────────────────────────────────
113
- ☁️ Cloud Transfer Mode
114
- │ Uploading from remote to cloud...
115
- └────────────────────────────────────────────────────────────────""")
116
- ssh.run(f"cloud_copy {resolved_source} :^", desc="Uploading from remote to the cloud.").print()
117
- print("""
118
- ┌────────────────────────────────────────────────────────────────
119
- │ ⬇️ Cloud Transfer Mode
120
- │ Downloading from cloud to local...
121
- └────────────────────────────────────────────────────────────────""")
122
- ssh.run_locally(f"cloud_copy :^ {resolved_target}").print()
131
+ console.print(
132
+ Panel.fit(
133
+ "☁️ Cloud transfer mode — uploading from remote to cloud...",
134
+ title="Cloud Upload",
135
+ border_style="cyan",
136
+ )
137
+ )
138
+ ssh.run_shell(command=f"cloud_copy {resolved_source} :^", verbose_output=True, description="Uploading from remote to the cloud.", strict_stderr=False, strict_return_code=False)
139
+ console.print(
140
+ Panel.fit(
141
+ "⬇️ Cloud transfer mode — downloading from cloud to local...",
142
+ title="Cloud Download",
143
+ border_style="cyan",
144
+ )
145
+ )
146
+ ssh.run_locally(command=f"cloud_copy :^ {resolved_target}")
123
147
  received_file = PathExtended(resolved_target) # type: ignore
124
148
  else:
125
149
  if source_is_remote:
126
- assert resolved_source is not None, """
127
- ❌ Path Error: Source must be a remote path (machine:path)"""
128
- print(f"""
129
- ┌────────────────────────────────────────────────────────────────
130
- 📥 Transfer Mode: Remote → Local
131
- │ Source: {resolved_source}
132
- │ Target: {resolved_target}
133
- │ Options: {"ZIP compression" if zipFirst else "No compression"}, {"Recursive" if recursive else "Non-recursive"}
134
- └────────────────────────────────────────────────────────────────""")
135
- received_file = ssh.copy_to_here(source=resolved_source, target=resolved_target, z=zipFirst, r=recursive)
150
+ if resolved_source is None:
151
+ typer.echo("""❌ Path Error: Source must be a remote path (machine:path)""")
152
+ typer.Exit(code=1)
153
+ return
154
+ target_display = resolved_target or "<auto>"
155
+ console.print(
156
+ Panel(
157
+ "\n".join(
158
+ [
159
+ "📥 Transfer Mode: Remote → Local",
160
+ f"Source: [cyan]{resolved_source}[/cyan]",
161
+ f"Target: [cyan]{target_display}[/cyan]",
162
+ f"Options: {'ZIP compression' if zipFirst else 'No compression'}, {'Recursive' if recursive else 'Non-recursive'}",
163
+ ]
164
+ ),
165
+ title="Transfer Details",
166
+ border_style="cyan",
167
+ padding=(1, 2),
168
+ )
169
+ )
170
+ received_file = ssh.copy_to_here(source=resolved_source, target=resolved_target, compress_with_zip=zipFirst, recursive=recursive)
136
171
  else:
137
172
  assert resolved_source is not None, """
138
173
  ❌ Path Error: Target must be a remote path (machine:path)"""
139
- print(f"""
140
- ┌────────────────────────────────────────────────────────────────
141
- │ 📤 Transfer Mode: Local → Remote
142
- │ Source: {resolved_source}
143
- │ Target: {resolved_target}
144
- │ Options: {"ZIP compression" if zipFirst else "No compression"}, {"Recursive" if recursive else "Non-recursive"}
145
- └────────────────────────────────────────────────────────────────""")
146
- received_file = ssh.copy_from_here(source=resolved_source, target=resolved_target, z=zipFirst, r=recursive)
174
+ target_display = resolved_target or "<auto>"
175
+ console.print(
176
+ Panel(
177
+ "\n".join(
178
+ [
179
+ "📤 Transfer Mode: Local Remote",
180
+ f"Source: [cyan]{resolved_source}[/cyan]",
181
+ f"Target: [cyan]{target_display}[/cyan]",
182
+ f"Options: {'ZIP compression' if zipFirst else 'No compression'}, {'Recursive' if recursive else 'Non-recursive'}",
183
+ ]
184
+ ),
185
+ title="Transfer Details",
186
+ border_style="cyan",
187
+ padding=(1, 2),
188
+ )
189
+ )
190
+ received_file = ssh.copy_from_here(source_path=resolved_source, target_rel2home=resolved_target, compress_with_zip=zipFirst, recursive=recursive, overwrite_existing=False)
147
191
 
148
192
  if source_is_remote and isinstance(received_file, PathExtended):
149
- print(f"""
150
- ┌────────────────────────────────────────────────────────────────
151
- │ 📁 File Received
152
- │ Parent: {repr(received_file.parent)}
153
- File: {repr(received_file)}
154
- └────────────────────────────────────────────────────────────────""")
155
- print("""
156
- ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
157
- ┃ ✅ Transfer Complete
158
- ┃ File transfer process finished successfully
159
- ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""")
160
-
161
-
162
- def main_from_parser() -> None:
193
+ console.print(
194
+ Panel(
195
+ "\n".join(
196
+ [
197
+ "📁 File Received",
198
+ f"Parent: [cyan]{repr(received_file.parent)}[/cyan]",
199
+ f"File: [cyan]{repr(received_file)}[/cyan]",
200
+ ]
201
+ ),
202
+ title="Transfer Result",
203
+ border_style="green",
204
+ padding=(1, 2),
205
+ )
206
+ )
207
+ console.print(
208
+ Panel(
209
+ "File transfer process finished successfully",
210
+ title="✅ Transfer Complete",
211
+ border_style="green",
212
+ padding=(1, 2),
213
+ )
214
+ )
215
+
216
+
217
+ def main() -> None:
163
218
  """Entry point function that uses typer to parse arguments and call main."""
164
- typer.run(main)
219
+ app = typer.Typer()
220
+ app.command(no_args_is_help=True, help="File transfer utility though SSH.")(ftpx)
221
+ app()
165
222
 
166
223
 
167
224
  if __name__ == "__main__":
168
- main_from_parser()
225
+ main()
@@ -0,0 +1,14 @@
1
+ {
2
+ "models": {
3
+ "large": {
4
+ "model": "{model}",
5
+ "provider": "{provider}",
6
+ "max_tokens": 100000
7
+ }
8
+ },
9
+ "providers": {
10
+ "openrouter": {
11
+ "api_key": "{api_key}"
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,37 @@
1
+
2
+ from pathlib import Path
3
+ # import shlex
4
+ from machineconfig.scripts.python.helpers_agents.fire_agents_helper_types import AI_SPEC
5
+
6
+
7
+ def fire_crush(ai_spec: AI_SPEC, prompt_path: Path, repo_root: Path) -> str:
8
+ match ai_spec["machine"]:
9
+ case "local":
10
+ cmd = f"""
11
+ crush run {prompt_path}
12
+ """
13
+ case "docker":
14
+ assert ai_spec["api_key"] is not None, "API key is required for Crush agent in docker mode."
15
+ json_path = Path(__file__).parent / "fire_crush.json"
16
+ json_template = json_path.read_text(encoding="utf-8")
17
+ json_filled = json_template.replace("{api_key}", ai_spec["api_key"]).replace("{model}", ai_spec["model"]).replace("{provider}", ai_spec["provider"])
18
+ from machineconfig.utils.accessories import randstr
19
+ temp_config_file_local = Path.home().joinpath("tmp_results/tmp_files/crush_" + randstr(8) + ".json")
20
+ temp_config_file_local.parent.mkdir(parents=True, exist_ok=True)
21
+ Path(temp_config_file_local).write_text(json_filled, encoding="utf-8")
22
+ cmd = f"""
23
+
24
+ # -e "PATH_PROMPT=$PATH_PROMPT"
25
+ # opencode --model "{ai_spec["provider"]}/{ai_spec["model"]}" run {prompt_path}
26
+
27
+
28
+ echo "Running prompt @ {prompt_path.relative_to(repo_root)} using Docker with Crush..."
29
+ docker run -it --rm \
30
+ -v "{repo_root}:/workspace/{repo_root.name}" \
31
+ -v "{temp_config_file_local}:/root/.local/share/crush/crush.json" \
32
+ -w "/workspace/{repo_root.name}" \
33
+ statistician/machineconfig-ai:latest \
34
+ bash -i -c "source ~/.bashrc && cd /workspace/{repo_root.name} && cat /root/.local/share/crush/crush.json && crush run 'Please act on contents of this prompt ./{prompt_path.relative_to(repo_root)}'"
35
+
36
+ """
37
+ return cmd
@@ -0,0 +1,22 @@
1
+
2
+
3
+ from pathlib import Path
4
+ # import shlex
5
+ from machineconfig.scripts.python.helpers_agents.fire_agents_helper_types import AI_SPEC
6
+
7
+ def fire_cursor(ai_spec: AI_SPEC, prompt_path: Path) -> str:
8
+ match ai_spec["machine"]:
9
+ case "local":
10
+ # Export the environment variable so it's available to subshells
11
+ cmd = f"""
12
+
13
+ cursor-agent --print --output-format text {prompt_path}
14
+
15
+ """
16
+ case "docker":
17
+ cmd = f"""
18
+
19
+ cursor-agent --print --output-format text {prompt_path}
20
+
21
+ """
22
+ return cmd
@@ -0,0 +1,42 @@
1
+
2
+ from pathlib import Path
3
+ import shlex
4
+ from machineconfig.scripts.python.helpers_agents.fire_agents_helper_types import AI_SPEC
5
+
6
+
7
+ def fire_gemini(ai_spec: AI_SPEC, prompt_path: Path, repo_root: Path) -> str:
8
+ _ = ai_spec["provider"]
9
+ # model = "gemini-2.5-flash-lite"
10
+ # model = None # auto-select
11
+ # if model is None:
12
+ # model_arg = ""
13
+ # else:
14
+ model_arg = f"--model {shlex.quote(ai_spec['model'])}"
15
+ # Need a real shell for the pipeline; otherwise '| gemini ...' is passed as args to 'cat'
16
+ safe_path = shlex.quote(str(prompt_path))
17
+
18
+ match ai_spec["machine"]:
19
+ case "local":
20
+ # Export the environment variable so it's available to subshells
21
+ if ai_spec["api_key"] is not None:
22
+ define_api_key = f"""export GEMINI_API_KEY="{shlex.quote(ai_spec['api_key'])}" """
23
+ else:
24
+ define_api_key = "echo 'Warning: No GEMINI_API_KEY provided, hoping it is set in the environment.'"
25
+ cmd = f"""
26
+ {define_api_key}
27
+ echo "Using Gemini API key $GEMINI_API_KEY"
28
+ gemini {model_arg} --yolo --prompt {safe_path}
29
+ """
30
+
31
+
32
+ case "docker":
33
+ assert ai_spec["api_key"] is not None, "When using docker, api_key must be provided."
34
+ cmd = f"""
35
+ docker run -it --rm \
36
+ -e GEMINI_API_KEY="{ai_spec['api_key']}" \
37
+ -v "{repo_root}:/workspace/{repo_root.name}" \
38
+ -w "/workspace/{repo_root.name}" \
39
+ statistician/machineconfig-ai:latest \
40
+ gemini --prompt "$PATH_PROMPT"
41
+ """
42
+ return cmd
@@ -0,0 +1,30 @@
1
+
2
+ from pathlib import Path
3
+ import shlex
4
+ from machineconfig.scripts.python.helpers_agents.fire_agents_helper_types import AI_SPEC
5
+
6
+
7
+ def fire_qwen(ai_spec: AI_SPEC, prompt_path: Path, repo_root: Path, config_dir: str | None) -> str:
8
+ _ = ai_spec["provider"]
9
+ safe_path = shlex.quote(str(prompt_path))
10
+ match ai_spec["machine"]:
11
+ case "local":
12
+ cmd = f"""
13
+ qwen --yolo --prompt {safe_path}
14
+ """
15
+ case "docker":
16
+ assert config_dir is not None, "When using docker, config_dir must be provided."
17
+ assert Path(config_dir).exists(), f"Provided config_dir {config_dir} does not exist."
18
+ oauth_creds = Path(config_dir).joinpath("oauth_creds.json")
19
+ settings = Path(config_dir).joinpath("settings.json")
20
+
21
+ cmd = f"""
22
+ docker run -it --rm \
23
+ -v "{repo_root}:/workspace/{repo_root.name}" \
24
+ -v {shlex.quote(str(oauth_creds))}:/root/.qwen/oauth_creds.json \
25
+ -v {shlex.quote(str(settings))}:/root/.qwen/settings.json \
26
+ -w "/workspace/{repo_root.name}" \
27
+ statistician/machineconfig-ai:latest \
28
+ qwen --prompt "$PATH_PROMPT"
29
+ """
30
+ return cmd
@@ -0,0 +1,110 @@
1
+
2
+ import random
3
+ import shlex
4
+ from pathlib import Path
5
+ from machineconfig.scripts.python.helpers_agents.fire_agents_helper_types import AGENTS, AGENT_NAME_FORMATTER, HOST, PROVIDER, AI_SPEC
6
+
7
+
8
+ def get_api_keys(provider: PROVIDER) -> list[str]:
9
+ from machineconfig.utils.io import read_ini
10
+ config = read_ini(Path.home().joinpath(f"dotfiles/creds/llm/{provider}/api_keys.ini"))
11
+ res: list[str] = []
12
+ for a_section_name in list(config.sections()):
13
+ a_section = config[a_section_name]
14
+ if "api_key" in a_section:
15
+ api_key = a_section["api_key"].strip()
16
+ if api_key:
17
+ res.append(api_key)
18
+ print(f"Found {len(res)} {provider} API keys configured.")
19
+ return res
20
+
21
+
22
+ def prep_agent_launch(repo_root: Path, agents_dir: Path, prompts_material: list[str], prompt_prefix: str, keep_material_in_separate_file: bool,
23
+ machine: HOST, model: str, provider: PROVIDER, agent: AGENTS, *, job_name: str) -> None:
24
+ agents_dir.mkdir(parents=True, exist_ok=True)
25
+ prompt_folder = agents_dir / "prompts"
26
+ prompt_folder.mkdir(parents=True, exist_ok=True)
27
+
28
+ for idx, a_prompt_material in enumerate(prompts_material):
29
+ prompt_root = prompt_folder / f"agent_{idx}"
30
+ prompt_root.mkdir(parents=True, exist_ok=True)
31
+ prompt_path = prompt_root / f"agent_{idx}_prompt.txt"
32
+ if keep_material_in_separate_file:
33
+ prompt_material_path = prompt_root / f"agent_{idx}_material.txt"
34
+ prompt_material_path.write_text(a_prompt_material, encoding="utf-8")
35
+ prompt_path.write_text(prompt_prefix + f"""\nPlease only look @ {prompt_material_path.relative_to(repo_root)}. You don't need to do any other work beside the content of this material file.""", encoding="utf-8")
36
+ else:
37
+ prompt_material_path = prompt_path
38
+ prompt_path.write_text(prompt_prefix + """\nPlease only look @ the following:\n""" + a_prompt_material, encoding="utf-8")
39
+
40
+ agent_cmd_launch_path = prompt_root / AGENT_NAME_FORMATTER.format(idx=idx) # e.g., agent_0_cmd.sh
41
+ random_sleep_time = random.uniform(0, 5)
42
+ cmd_prefix = f"""#!/usr/bin/env bash
43
+
44
+ echo "Using machine: {machine}, model: {model}, provider: {provider}, and agent: {agent}"
45
+ echo "{job_name}-{idx} CMD {agent_cmd_launch_path}"
46
+ echo "{job_name}-{idx} PROMPT {prompt_path}"
47
+ echo "{job_name}-{idx} CONTEXT {prompt_material_path}"
48
+ echo "Starting agent {agent} in 5 seconds... Press Ctrl+C to cancel."
49
+ # sleep 5
50
+ # timeout 3 copilot --banner
51
+
52
+ export FIRE_AGENTS_AGENT_NAME="{agent}"
53
+ export FIRE_AGENTS_JOB_NAME="{job_name}"
54
+ export FIRE_AGENTS_PROMPT_FILE="{prompt_path}"
55
+ export FIRE_AGENTS_MATERIAL_FILE="{prompt_material_path}"
56
+ export FIRE_AGENTS_AGENT_LAUNCHER="{agent_cmd_launch_path}"
57
+
58
+ echo "Sleeping for {random_sleep_time:.2f} seconds to stagger agent startups..."
59
+ sleep {random_sleep_time:.2f}
60
+ echo "--------START OF AGENT OUTPUT--------"
61
+ sleep 0.1
62
+
63
+ """
64
+ match agent:
65
+ case "gemini":
66
+ assert provider == "google", "Gemini agent only works with google provider."
67
+ api_keys = get_api_keys(provider="google")
68
+ api_key = api_keys[idx % len(api_keys)] if len(api_keys) > 0 else None
69
+ ai_spec: AI_SPEC = AI_SPEC(provider=provider, model="gemini-2.5-pro", agent=agent, machine=machine, api_key=api_key, api_name="gemini")
70
+ from machineconfig.scripts.python.helpers_agents.agentic_frameworks.fire_gemini import fire_gemini
71
+ cmd = fire_gemini(ai_spec=ai_spec, prompt_path=prompt_path, repo_root=repo_root)
72
+ case "cursor-agent":
73
+ ai_spec: AI_SPEC = AI_SPEC(provider=provider, model=model, agent=agent, machine=machine, api_key=None, api_name="cursor")
74
+ from machineconfig.scripts.python.helpers_agents.agentic_frameworks.fire_cursor_agents import fire_cursor
75
+ cmd = fire_cursor(ai_spec=ai_spec, prompt_path=prompt_path)
76
+ raise NotImplementedError("Cursor agent is not implemented yet, api key missing")
77
+ case "crush":
78
+ api_keys = get_api_keys(provider=provider)
79
+ api_key = api_keys[idx % len(api_keys)] if len(api_keys) > 0 else None
80
+ ai_spec: AI_SPEC = AI_SPEC(provider=provider, model=model, agent=agent, machine=machine, api_key=api_key, api_name="crush")
81
+ from machineconfig.scripts.python.helpers_agents.agentic_frameworks.fire_crush import fire_crush
82
+ cmd = fire_crush(ai_spec=ai_spec, prompt_path=prompt_path, repo_root=repo_root)
83
+ # case "q":
84
+ # from machineconfig.scripts.python.helpers_fire.fire_q import fire_q
85
+ # cmd = fire_q(api_key="", prompt_path=prompt_path, machine=machine)
86
+ case _:
87
+ raise ValueError(f"Unsupported agent type: {agent}")
88
+
89
+ cmd_postfix = """
90
+ sleep 0.1
91
+ echo "---------END OF AGENT OUTPUT---------"
92
+ """
93
+ agent_cmd_launch_path.write_text(cmd_prefix + cmd + cmd_postfix, encoding="utf-8")
94
+ return None
95
+
96
+
97
+ def get_agents_launch_layout(session_root: Path):
98
+ from machineconfig.utils.schemas.layouts.layout_types import TabConfig, LayoutConfig, LayoutsFile
99
+
100
+ tab_config: list[TabConfig] = []
101
+ prompt_root = session_root / "prompts"
102
+ all_dirs_under_prompts = [d for d in prompt_root.iterdir() if d.is_dir()]
103
+ for a_prompt_dir in all_dirs_under_prompts:
104
+ idx = a_prompt_dir.name.split("_")[-1] # e.g., agent_0 -> 0
105
+ agent_cmd_path = a_prompt_dir / AGENT_NAME_FORMATTER.format(idx=idx)
106
+ fire_cmd = f"bash {shlex.quote(str(agent_cmd_path))}"
107
+ tab_config.append(TabConfig(tabName=f"Agent{idx}", startDir=str(session_root.parent.parent.parent), command=fire_cmd))
108
+ layout = LayoutConfig(layoutName="Agents", layoutTabs=tab_config)
109
+ layouts_file: LayoutsFile = LayoutsFile(version="1.0", layouts=[layout])
110
+ return layouts_file
@@ -0,0 +1,34 @@
1
+
2
+ from typing import Literal, TypeAlias, TypedDict
3
+
4
+
5
+ # Vscode extensions for AI-assisted coding.
6
+ # Github copilot
7
+ # Roo
8
+ # Cline
9
+ # Kilocode
10
+ # Continue
11
+ # CodeGPT
12
+ # qodo (and cli)
13
+
14
+ # Editors based on AI
15
+ # Kiro
16
+ # Cursor
17
+ # Warp
18
+
19
+ AGENTS: TypeAlias = Literal["cursor-agent", "gemini", "qwen-code", "copilot", "crush", "q", "opencode", "kilocode", "cline", "auggie", "warp", "droid"]
20
+ HOST: TypeAlias = Literal["local", "docker"]
21
+ PROVIDER: TypeAlias = Literal["azure", "google", "aws", "openai", "anthropic", "openrouter", "xai"]
22
+
23
+ class AI_SPEC(TypedDict):
24
+ provider: PROVIDER
25
+ model: str
26
+ agent: AGENTS
27
+ machine: HOST
28
+ api_key: str | None
29
+ api_name: str
30
+
31
+
32
+ AGENT_NAME_FORMATTER = "agent_{idx}_cmd.sh" # e.g., agent_0_cmd.sh
33
+ SEARCH_STRATEGIES: TypeAlias = Literal["file_path", "keyword_search", "filename_pattern"]
34
+
@@ -0,0 +1,22 @@
1
+ # from math import ceil
2
+ from pathlib import Path
3
+
4
+
5
+ def chunk_prompts(prompt_material_path: Path, joiner: str, *, tasks_per_prompt: int) -> list[str]:
6
+ """Chunk prompts based on splitting strategy.
7
+
8
+ Args:
9
+ prompts: List of prompts to chunk
10
+ strategy: Either 'agent_cap' or 'task_rows'
11
+ agent_cap: Maximum number of agents (used with 'agent_cap' strategy)
12
+ task_rows: Number of rows/tasks per agent (used with 'task_rows' strategy)
13
+ """
14
+ prompts = [p for p in prompt_material_path.read_text(encoding="utf-8", errors="ignore").split(joiner) if p.strip() != ""] # drop blank entries
15
+ if tasks_per_prompt >= len(prompts):
16
+ print("No need to chunk prompts, as tasks_per_prompt >= total prompts.", f"({tasks_per_prompt} >= {len(prompts)})")
17
+ return prompts
18
+ print(f"Chunking {len(prompts)} prompts into groups of {tasks_per_prompt} rows/tasks each.")
19
+ grouped: list[str] = []
20
+ for i in range(0, len(prompts), tasks_per_prompt):
21
+ grouped.append(joiner.join(prompts[i : i + tasks_per_prompt]))
22
+ return grouped
@@ -0,0 +1,6 @@
1
+
2
+ please look if it is possible to easily relpace PathExtended with normal Path from pathlib
3
+ if its one or two lines of code, then go ahead and make it standard and stop using the extended library
4
+ you focus ont he methods used,
5
+
6
+ only look at the files below
@@ -0,0 +1,14 @@
1
+ # Set error action preference to stop on error, like set -e
2
+ $ErrorActionPreference = "Stop"
3
+
4
+ $JOB_NAME = "outpatient_mapping"
5
+ $REPO_ROOT = "$HOME/code/work/winter_planning/"
6
+ $CONTEXT_PATH = "$REPO_ROOT/data/outpatient_mapping/op_services.csv"
7
+ $PROMPT_PATH = "$REPO_ROOT/data/outpatient_mapping/prompt"
8
+ $AGENTS_DIR = "$REPO_ROOT/.ai/agents/$JOB_NAME"
9
+
10
+ agents create --agents crush --host docker --model x-ai/grok-4-fast:free --provider openrouter --context-path $CONTEXT_PATH --prompt-path $PROMPT_PATH --job-name $JOB_NAME --agents-dir $AGENTS_DIR
11
+ sessions balance-load "$AGENTS_DIR/layout.json" --max-thresh 6 --breaking-method moreLayouts --thresh-type number --output-path "$AGENTS_DIR/layout_balanced.json"
12
+ sessions run "$AGENTS_DIR/layout_balanced.json" --kill-upon-completion
13
+
14
+ # agents collect $AGENTS_DIR "$REPO_ROOT/.ai/agents/$JOB_NAME/collected.txt"
@@ -0,0 +1,24 @@
1
+
2
+ #!/bin/bash
3
+ # set -e # Exit immediately if a command exits with a non-zero status.
4
+
5
+ JOB_NAME="outpatient_mapping"
6
+ REPO_ROOT="$HOME/code/machineconfig"
7
+ CONTEXT_PATH="$REPO_ROOT/.ai/todo/files.md"
8
+ # agents make-todo --strategy keywords from machineconfig.utils.path_extended import PathExtended
9
+ PROMPT_PATH="$REPO_ROOT/src/machineconfig/scripts/python/helpers_agents/templates/prompt.txt"
10
+ AGENTS_DIR="$REPO_ROOT/.ai/agents/$JOB_NAME"
11
+
12
+ agents create --agents crush \
13
+ --host docker \
14
+ --model x-ai/grok-4-fast:free \
15
+ --provider openrouter \
16
+ --context-path $CONTEXT_PATH \
17
+ --prompt-path $PROMPT_PATH \
18
+ --job-name $JOB_NAME \
19
+ --agents-dir $AGENTS_DIR
20
+ sessions balance-load "$AGENTS_DIR/layout.json" --max-thresh 6 --breaking-method moreLayouts --thresh-type number --output-path "$AGENTS_DIR/layout_balanced.json"
21
+ sessions run "$AGENTS_DIR/layout_balanced.json" --kill-upon-completion
22
+
23
+
24
+ # agents collect $AGENTS_DIR "$REPO_ROOT/.ai/agents/$JOB_NAME/collected.txt"