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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/cloud_manager.py +1 -1
  3. machineconfig/cluster/remote/distribute.py +0 -1
  4. machineconfig/cluster/remote/file_manager.py +0 -2
  5. machineconfig/cluster/remote/script_execution.py +0 -1
  6. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  7. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  8. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  9. machineconfig/cluster/sessions_managers/wt_local.py +114 -289
  10. machineconfig/cluster/sessions_managers/wt_local_manager.py +70 -210
  11. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  12. machineconfig/cluster/sessions_managers/wt_remote_manager.py +52 -198
  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 +25 -170
  21. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  22. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +16 -12
  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 -3
  32. machineconfig/jobs/installer/custom/boxes.py +61 -0
  33. machineconfig/jobs/installer/custom/hx.py +76 -19
  34. machineconfig/jobs/installer/custom/yazi.py +119 -0
  35. machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
  36. machineconfig/jobs/installer/custom_dev/brave.py +5 -9
  37. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  38. machineconfig/jobs/installer/custom_dev/code.py +4 -1
  39. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  40. machineconfig/jobs/installer/custom_dev/nerdfont.py +1 -1
  41. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +33 -28
  42. machineconfig/jobs/installer/custom_dev/sysabc.py +139 -0
  43. machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
  44. machineconfig/jobs/installer/custom_dev/winget.py +10 -14
  45. machineconfig/jobs/installer/installer_data.json +1487 -229
  46. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  47. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  48. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  49. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  50. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  51. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  52. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  53. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  54. machineconfig/jobs/installer/linux_scripts/q.sh +10 -6
  55. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  56. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  57. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  58. machineconfig/jobs/installer/package_groups.py +106 -177
  59. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  60. machineconfig/logger.py +0 -1
  61. machineconfig/profile/backup.toml +49 -0
  62. machineconfig/profile/bash_shell_profiles.md +11 -0
  63. machineconfig/profile/create_helper.py +62 -0
  64. machineconfig/profile/create_links.py +288 -0
  65. machineconfig/profile/create_links_export.py +100 -0
  66. machineconfig/profile/create_shell_profile.py +147 -0
  67. machineconfig/profile/mapper.toml +263 -0
  68. machineconfig/scripts/__init__.py +0 -4
  69. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  70. machineconfig/scripts/linux/wrap_mcfg +46 -0
  71. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  72. machineconfig/scripts/python/agents.py +123 -117
  73. machineconfig/scripts/python/ai/initai.py +3 -28
  74. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  75. machineconfig/scripts/python/ai/scripts/command_runner.sh +9 -0
  76. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  77. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  78. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  79. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  80. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  81. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  82. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
  83. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +5 -1
  84. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  85. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  86. machineconfig/scripts/python/ai/solutions/generic.py +28 -5
  87. machineconfig/scripts/python/ai/utils/generate_files.py +348 -0
  88. machineconfig/scripts/python/ai/utils/vscode_tasks.py +37 -0
  89. machineconfig/scripts/python/cloud.py +29 -0
  90. machineconfig/scripts/python/croshell.py +137 -113
  91. machineconfig/scripts/python/devops.py +61 -101
  92. machineconfig/scripts/python/devops_navigator.py +6 -0
  93. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  94. machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
  95. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  96. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  97. machineconfig/scripts/python/fire_jobs.py +110 -150
  98. machineconfig/scripts/python/ftpx.py +51 -24
  99. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  100. machineconfig/scripts/python/helpers/qr_code.py +166 -0
  101. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  102. machineconfig/scripts/python/helpers/run_py_script.py +79 -0
  103. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  104. machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +26 -0
  105. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  106. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  107. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  108. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  109. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  110. machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +126 -0
  111. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
  112. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
  113. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  114. machineconfig/scripts/python/helpers_agents/templates/template.sh +32 -0
  115. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  116. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +29 -35
  117. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  118. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
  119. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  120. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +8 -9
  121. machineconfig/scripts/python/helpers_devops/cli_config.py +105 -0
  122. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  123. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  124. machineconfig/scripts/python/helpers_devops/cli_nw.py +214 -0
  125. machineconfig/scripts/python/helpers_devops/cli_repos.py +215 -0
  126. machineconfig/scripts/python/helpers_devops/cli_self.py +172 -0
  127. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  128. machineconfig/scripts/python/helpers_devops/cli_share_server.py +142 -0
  129. machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_share_terminal.py} +45 -35
  130. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  131. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  132. machineconfig/scripts/python/helpers_devops/devops_status.py +499 -0
  133. machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
  134. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  135. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  136. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +3 -3
  137. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  138. machineconfig/scripts/python/helpers_fire_command/f.py +0 -0
  139. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
  140. machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
  141. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +121 -0
  142. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  143. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  144. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
  145. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  146. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  147. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  148. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  149. machineconfig/scripts/python/helpers_navigator/command_tree.py +620 -0
  150. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  151. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  152. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  153. machineconfig/scripts/python/helpers_network/__init__.py +0 -0
  154. machineconfig/scripts/python/helpers_network/address.py +132 -0
  155. machineconfig/scripts/python/{devops_add_identity.py → helpers_network/devops_add_identity.py} +0 -2
  156. machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +153 -0
  157. machineconfig/scripts/{linux → python/helpers_network}/mount_nfs +0 -1
  158. machineconfig/scripts/python/{mount_nfs.py → helpers_network/mount_nfs.py} +3 -3
  159. machineconfig/scripts/{linux → python/helpers_network}/mount_nw_drive +1 -2
  160. machineconfig/scripts/python/{mount_ssh.py → helpers_network/mount_ssh.py} +3 -3
  161. machineconfig/scripts/python/{onetimeshare.py → helpers_network/onetimeshare.py} +0 -1
  162. machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +391 -0
  163. machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +338 -0
  164. machineconfig/scripts/python/{wifi_conn.py → helpers_network/wifi_conn.py} +1 -53
  165. machineconfig/scripts/python/{wsl_windows_transfer.py → helpers_network/wsl_windows_transfer.py} +5 -4
  166. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  167. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  168. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
  169. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  170. machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
  171. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  172. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
  173. machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
  174. machineconfig/scripts/python/{count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
  175. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  176. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  177. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  178. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +65 -0
  179. machineconfig/scripts/python/helpers_utils/download.py +150 -0
  180. machineconfig/scripts/python/helpers_utils/path.py +185 -0
  181. machineconfig/scripts/python/interactive.py +64 -84
  182. machineconfig/scripts/python/mcfg_entry.py +58 -0
  183. machineconfig/scripts/python/msearch.py +71 -0
  184. machineconfig/scripts/python/sessions.py +119 -45
  185. machineconfig/scripts/python/terminal.py +133 -0
  186. machineconfig/scripts/python/utils.py +64 -0
  187. machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +92 -0
  188. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  189. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  190. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  191. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  192. machineconfig/settings/broot/br.sh +0 -4
  193. machineconfig/settings/broot/conf.toml +1 -1
  194. machineconfig/settings/helix/config.toml +16 -0
  195. machineconfig/settings/helix/languages.toml +13 -4
  196. machineconfig/settings/helix/yazi-picker.sh +12 -0
  197. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  198. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  199. machineconfig/settings/lf/linux/lfrc +10 -12
  200. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  201. machineconfig/settings/lf/windows/lfrc +18 -38
  202. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  203. machineconfig/settings/linters/.ruff.toml +1 -1
  204. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  205. machineconfig/settings/marimo/marimo.toml +80 -0
  206. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  207. machineconfig/settings/pistol/pistol.conf +1 -1
  208. machineconfig/settings/shells/bash/init.sh +82 -31
  209. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  210. machineconfig/settings/shells/nushell/config.nu +2 -35
  211. machineconfig/settings/shells/nushell/env.nu +45 -6
  212. machineconfig/settings/shells/nushell/init.nu +314 -0
  213. machineconfig/settings/shells/pwsh/init.ps1 +61 -43
  214. machineconfig/settings/shells/starship/starship.toml +16 -0
  215. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  216. machineconfig/settings/shells/wt/settings.json +32 -17
  217. machineconfig/settings/shells/zsh/init.sh +89 -0
  218. machineconfig/settings/svim/linux/init.toml +0 -4
  219. machineconfig/settings/svim/windows/init.toml +0 -3
  220. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  221. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  222. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  223. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  224. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  225. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  226. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  227. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  228. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  229. machineconfig/settings/television/cable_unix/env.toml +17 -0
  230. machineconfig/settings/television/cable_unix/files.toml +11 -0
  231. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  232. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  233. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  234. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  235. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  236. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  237. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  238. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  239. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  240. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  241. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  242. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  243. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  244. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  245. machineconfig/settings/television/cable_unix/text.toml +17 -0
  246. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  247. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  248. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  249. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  250. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  251. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  252. machineconfig/settings/television/cable_windows/env.toml +17 -0
  253. machineconfig/settings/television/cable_windows/files.toml +14 -0
  254. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  255. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  256. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  257. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  258. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  259. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  260. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  261. machineconfig/settings/television/cable_windows/text.toml +17 -0
  262. machineconfig/settings/yazi/init.lua +61 -0
  263. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  264. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  265. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  266. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  267. machineconfig/settings/yazi/theme.toml +4 -0
  268. machineconfig/settings/yazi/yazi_linux.toml +84 -0
  269. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  270. machineconfig/setup_linux/__init__.py +11 -0
  271. machineconfig/setup_linux/apps_desktop.sh +89 -0
  272. machineconfig/setup_linux/apps_gui.sh +64 -0
  273. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  274. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  275. machineconfig/setup_linux/uv.sh +15 -0
  276. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  277. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
  278. machineconfig/setup_mac/__init__.py +16 -0
  279. machineconfig/setup_mac/apps_gui.sh +248 -0
  280. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  281. machineconfig/setup_mac/uv.sh +36 -0
  282. machineconfig/setup_windows/__init__.py +11 -0
  283. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  284. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  285. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  286. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  287. machineconfig/setup_windows/uv.ps1 +17 -0
  288. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
  289. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
  290. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  291. machineconfig/utils/accessories.py +7 -5
  292. machineconfig/utils/cloud/onedrive/README.md +139 -0
  293. machineconfig/utils/code.py +155 -105
  294. machineconfig/utils/files/art/fat_croco.txt +10 -0
  295. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  296. machineconfig/utils/files/art/happy_croco.txt +22 -0
  297. machineconfig/utils/files/art/water_croco.txt +11 -0
  298. machineconfig/utils/files/ascii_art.py +1 -1
  299. machineconfig/utils/files/dbms.py +257 -0
  300. machineconfig/utils/files/headers.py +11 -14
  301. machineconfig/utils/files/ouch/__init__.py +0 -0
  302. machineconfig/utils/files/ouch/decompress.py +45 -0
  303. machineconfig/utils/files/read.py +10 -18
  304. machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
  305. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  306. machineconfig/utils/installer_utils/installer_class.py +64 -181
  307. machineconfig/utils/installer_utils/installer_cli.py +175 -0
  308. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  309. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +66 -97
  310. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +49 -82
  311. machineconfig/utils/io.py +77 -23
  312. machineconfig/utils/links.py +254 -162
  313. machineconfig/utils/meta.py +256 -0
  314. machineconfig/utils/notifications.py +1 -1
  315. machineconfig/utils/options.py +46 -18
  316. machineconfig/utils/options_tv.py +119 -0
  317. machineconfig/utils/path_extended.py +48 -101
  318. machineconfig/utils/path_helper.py +76 -23
  319. machineconfig/utils/procs.py +50 -70
  320. machineconfig/utils/scheduler.py +88 -124
  321. machineconfig/utils/scheduling.py +0 -3
  322. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  323. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  324. machineconfig/utils/source_of_truth.py +3 -6
  325. machineconfig/utils/ssh.py +263 -274
  326. machineconfig/utils/ssh_utils/abc.py +5 -0
  327. machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
  328. machineconfig/utils/ssh_utils/copy_to_here.py +302 -0
  329. machineconfig/utils/ssh_utils/utils.py +142 -0
  330. machineconfig/utils/ssh_utils/wsl.py +210 -0
  331. machineconfig/utils/terminal.py +3 -113
  332. machineconfig/utils/tst.py +20 -0
  333. machineconfig/utils/upgrade_packages.py +114 -28
  334. machineconfig/utils/ve.py +12 -4
  335. machineconfig-7.98.dist-info/METADATA +132 -0
  336. machineconfig-7.98.dist-info/RECORD +504 -0
  337. machineconfig-7.98.dist-info/entry_points.txt +13 -0
  338. machineconfig/cluster/sessions_managers/ffile.py +0 -4
  339. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  340. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  341. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  342. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  343. machineconfig/jobs/python/vscode/api.py +0 -57
  344. machineconfig/jobs/python/vscode/sync_code.py +0 -73
  345. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  346. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  347. machineconfig/jobs/windows/startup_file.cmd +0 -2
  348. machineconfig/profile/create.py +0 -303
  349. machineconfig/profile/shell.py +0 -176
  350. machineconfig/scripts/cloud/init.sh +0 -119
  351. machineconfig/scripts/linux/agents +0 -2
  352. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  353. machineconfig/scripts/linux/cloud_copy +0 -2
  354. machineconfig/scripts/linux/cloud_mount +0 -2
  355. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  356. machineconfig/scripts/linux/cloud_sync +0 -2
  357. machineconfig/scripts/linux/croshell +0 -3
  358. machineconfig/scripts/linux/devops +0 -2
  359. machineconfig/scripts/linux/fire +0 -2
  360. machineconfig/scripts/linux/ftpx +0 -2
  361. machineconfig/scripts/linux/fzf2g +0 -21
  362. machineconfig/scripts/linux/fzfag +0 -17
  363. machineconfig/scripts/linux/fzffg +0 -25
  364. machineconfig/scripts/linux/fzfrga +0 -21
  365. machineconfig/scripts/linux/gh_models +0 -2
  366. machineconfig/scripts/linux/initai +0 -2
  367. machineconfig/scripts/linux/kill_process +0 -2
  368. machineconfig/scripts/linux/scheduler +0 -2
  369. machineconfig/scripts/linux/sessions +0 -2
  370. machineconfig/scripts/linux/share_smb +0 -1
  371. machineconfig/scripts/linux/skrg +0 -4
  372. machineconfig/scripts/linux/start_slidev +0 -2
  373. machineconfig/scripts/linux/start_terminals +0 -3
  374. machineconfig/scripts/linux/warp-cli.sh +0 -122
  375. machineconfig/scripts/linux/wifi_conn +0 -2
  376. machineconfig/scripts/linux/z_ls +0 -104
  377. machineconfig/scripts/python/ai/generate_files.py +0 -83
  378. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  379. machineconfig/scripts/python/cloud_repo_sync.py +0 -190
  380. machineconfig/scripts/python/count_lines_frontend.py +0 -16
  381. machineconfig/scripts/python/devops_add_ssh_key.py +0 -120
  382. machineconfig/scripts/python/dotfile.py +0 -78
  383. machineconfig/scripts/python/fire_agents_help_launch.py +0 -120
  384. machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
  385. machineconfig/scripts/python/fire_jobs_route_helper.py +0 -65
  386. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  387. machineconfig/scripts/python/gh_models.py +0 -104
  388. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
  389. machineconfig/scripts/python/repos.py +0 -132
  390. machineconfig/scripts/python/repos_helper_action.py +0 -378
  391. machineconfig/scripts/python/snapshot.py +0 -25
  392. machineconfig/scripts/python/start_terminals.py +0 -121
  393. machineconfig/scripts/python/t4.py +0 -17
  394. machineconfig/scripts/windows/agents.ps1 +0 -1
  395. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  396. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  397. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  398. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  399. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  400. machineconfig/scripts/windows/croshell.ps1 +0 -1
  401. machineconfig/scripts/windows/devops.ps1 +0 -1
  402. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  403. machineconfig/scripts/windows/fire.ps1 +0 -1
  404. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  405. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  406. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  407. machineconfig/scripts/windows/fzfrga.bat +0 -20
  408. machineconfig/scripts/windows/gpt.ps1 +0 -1
  409. machineconfig/scripts/windows/grep.ps1 +0 -2
  410. machineconfig/scripts/windows/initai.ps1 +0 -1
  411. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  412. machineconfig/scripts/windows/nano.ps1 +0 -3
  413. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  414. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  415. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  416. machineconfig/scripts/windows/sessions.ps1 +0 -1
  417. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  418. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  419. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  420. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  421. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  422. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  423. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  424. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  425. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  426. machineconfig/settings/yazi/yazi.toml +0 -4
  427. machineconfig/setup_linux/nix/cli_installation.sh +0 -157
  428. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  429. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  430. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  431. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  432. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  433. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  434. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  435. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  436. machineconfig/utils/installer_utils/installer.py +0 -189
  437. machineconfig-5.15.dist-info/METADATA +0 -188
  438. machineconfig-5.15.dist-info/RECORD +0 -415
  439. machineconfig-5.15.dist-info/entry_points.txt +0 -18
  440. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  441. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  442. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  443. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  444. machineconfig/{jobs/python → scripts/python/ai/utils}/__init__.py +0 -0
  445. machineconfig/scripts/python/{helpers → helpers_agents}/__init__.py +0 -0
  446. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_agents/agentic_frameworks/__init__.py} +0 -0
  447. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  448. machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
  449. machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_cloud/__init__.py} +0 -0
  450. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  451. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  452. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_croshell/__init__.py} +0 -0
  453. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  454. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  455. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  456. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  457. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/__init__.py} +0 -0
  458. /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers_devops/themes/__init__.py} +0 -0
  459. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  460. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  461. /machineconfig/scripts/{linux → python/helpers_network}/mount_drive +0 -0
  462. /machineconfig/scripts/python/{mount_nw_drive.py → helpers_network/mount_nw_drive.py} +0 -0
  463. /machineconfig/scripts/{linux → python/helpers_network}/mount_smb +0 -0
  464. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  465. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  466. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  467. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  468. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  469. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  470. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  471. {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/WHEEL +0 -0
  472. {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/top_level.txt +0 -0
@@ -34,12 +34,16 @@ applyTo: "**/*.py"
34
34
  * when finished, run a linting static analysis check against files you touched, Any fix any mistakes.
35
35
  * Please run `uv run -m pyright $file_touched` and address all issues. if `pyright is not there, first run `uv add pyright --dev`.
36
36
  * For all type checkers and linters, like mypy, pyright, pyrefly and pylint, there are config files at different levels of the repo all the way up to home directory level. You don't need to worry about them, just be mindful that they exist. The tools themselves will respect the configs therein.
37
- * If you want to run all linters and pycheckers agains the entire project to make sure everything is clean, I prepared a nice shell script, you can run it from the repo root as `./.scripts/lint_and_typecheck.sh`. It will produce markdown files that are you are meant to look at @ ./.linters/*.md
37
+ * If you want to run all linters and pycheckers agains the entire project to make sure everything is clean, I prepared a nice shell script, you can run it from the repo root as `./.ai/scripts/lint_and_type_check.sh`. It will produce markdown files that are you are meant to look at @ ./.ai/linters/*.md
38
38
 
39
39
  # General Programming Ethos:
40
40
  * Make sure all the code is rigorous, no lazy stuff.
41
41
  * For example, always avoid default values in arguments of functions. Those are evil and cause confusion. Always be explicit in parameter passing.
42
42
  * Please never ever attempt to change code files by writing meta code to do string manipulation on files, e.g. with `sed` command with terminal. Please do change the files one by one, no matter how many there is. Don't worry about time, nor context window size, its okay, take your time and do the legwork. You can stop in the middle and we will have another LLM to help with the rest.
43
+ * Your code is minimal, no unrequested features, no bloat.
43
44
  * Please avoid writing README files and avoid docstring and comments in code unless absolutely necessary. Use clear naming conventions instead of documenting.
44
45
  * Always prefer to functional style of programming over OOP.
45
46
  * When passing arguments or constructing dicts or lists or tuples, avoid breaking lines too much, try to use ~ 150 characters per line before breaking to new one.
47
+
48
+ # Privacy:
49
+ * No matter what, never ever open/read/write/list anything under ~/dotfiles
@@ -0,0 +1,20 @@
1
+
2
+
3
+ * I have started a watch-exec server in my terminal and its working now.
4
+ * I have set it up to re-run the shell script `.ai/terminal/debug/command_runner.sh` automatically.
5
+ * A re-run is triggered upon any change of any python file in the repo, or, any change in the command_runner.sh script itself.
6
+ * The shell script itself runs the python file we are working on using uv.
7
+ * The script redirects the output from terminal to the file ./.ai* Run takes 50 ms only. So by the time you finish editing any python file or the command runner script, the new output is ready for you to read in that text file.
8
+ * Run takes 50 ms only. So by the time you finish editing any python file or the command runner script, the new output is ready for you to read in that text file.
9
+
10
+ # Why did I set this up?
11
+ * Because this makes it much faster for you to iterate because pulling the terminal and closing it every time is a bit slow.
12
+ * You no longer need the terminal.
13
+
14
+
15
+ # What should you do now?
16
+ Please iterate like this:
17
+ * Please use the terminal_output.txt as your main iteration driver (fix any problems you see there).
18
+ * Change `command_runner.sh` if you need to change which python file to run or how to run it.
19
+
20
+
@@ -0,0 +1,16 @@
1
+ ---
2
+ mode: agent
3
+ ---
4
+
5
+
6
+ $PYRIGHT_ISSUES_FILE = "./.ai/linters/issues_pyright.md"
7
+ $NUM_TASKS = 50
8
+ please create $NUM_TASKS todo-list tasks to go through the first $NUM_TASKS
9
+ from $PYRIGHT_ISSUES_FILE, and solve them independently in each task.
10
+ When creating the tasks, try to keep issues related to one pyfile in one task, so you don't read the same file twice in different tasks.
11
+
12
+ once you solved them, you will have 2 months break from work.
13
+
14
+ Start by runing `./.ai/scripts/lint_and_type_check.sh` to generate $PYRIGHT_ISSUES_FILE only once.
15
+
16
+
@@ -1,14 +1,36 @@
1
+
1
2
  from pathlib import Path
3
+ import platform
2
4
 
3
5
  from machineconfig.utils.source_of_truth import LIBRARY_ROOT
4
6
 
5
7
 
6
8
  def create_dot_scripts(repo_root: Path) -> None:
7
9
  scripts_dir = LIBRARY_ROOT.joinpath("scripts/python/ai/scripts")
8
- target_dir = repo_root.joinpath(".scripts")
10
+ target_dir = repo_root.joinpath(".ai/scripts")
11
+ import shutil
12
+ shutil.rmtree(target_dir, ignore_errors=True)
9
13
  target_dir.mkdir(parents=True, exist_ok=True)
10
- for script_path in scripts_dir.iterdir():
11
- target_dir.joinpath(script_path.name).write_text(data=script_path.read_text(encoding="utf-8"), encoding="utf-8")
14
+ import platform
15
+ if platform.system() == "Windows":
16
+ script_path = scripts_dir.joinpath("lint_and_type_check.ps1")
17
+ elif platform.system() in ["Linux", "Darwin"]:
18
+ script_path = scripts_dir.joinpath("lint_and_type_check.sh")
19
+ else:
20
+ raise NotImplementedError(f"Platform {platform.system()} is not supported.")
21
+ target_dir.joinpath(script_path.name).write_text(data=script_path.read_text(encoding="utf-8"), encoding="utf-8")
22
+
23
+
24
+ def adjust_for_os(config_path: Path) -> str:
25
+ if config_path.suffix not in [".md", ".txt"]:
26
+ return config_path.read_text(encoding="utf-8")
27
+ english_text = config_path.read_text(encoding="utf-8")
28
+ if platform.system() == "Windows":
29
+ return english_text.replace("bash", "PowerShell").replace("sh ", "pwsh ").replace("./", ".\\").replace(".sh", ".ps1")
30
+ elif platform.system() in ["Linux", "Darwin"]:
31
+ return english_text.replace("PowerShell", "bash").replace("pwsh ", "sh ").replace(".\\", "./").replace(".ps1", ".sh")
32
+ else:
33
+ raise NotImplementedError(f"Platform {platform.system()} is not supported.")
12
34
 
13
35
 
14
36
  def adjust_gitignore(repo_root: Path) -> None:
@@ -22,12 +44,13 @@ def adjust_gitignore(repo_root: Path) -> None:
22
44
  ".links",
23
45
  "notebooks",
24
46
  ".ai",
25
- ".scripts",
26
47
  "GEMINI.md",
27
48
  "CLAUDE.md",
49
+ "CRUSH.md",
28
50
  ".cursor",
51
+ ".clinerules",
29
52
  ".github/instructions",
30
- ".github/chatmodes",
53
+ ".github/agents",
31
54
  ".github/prompts",
32
55
  ]
33
56
 
@@ -0,0 +1,348 @@
1
+ #!/usr/bin/env python3
2
+ """Script to generate a markdown table with checkboxes for all Python and shell files in the repo."""
3
+
4
+ from pathlib import Path
5
+ from typing import Annotated, Literal, Optional
6
+ from rich.console import Console
7
+ from rich.panel import Panel
8
+ import typer
9
+ import subprocess
10
+ import shutil
11
+
12
+
13
+ def get_python_files(repo_root: Path, exclude_init: bool = False) -> list[str]:
14
+ """Get all Python files relative to repo root."""
15
+ excluded_parts = {".venv", "__pycache__", ".git", "build", "dist", ".ai"}
16
+ excluded_patterns = {"*.egg-info"}
17
+
18
+ # Get all .py files recursively
19
+ py_files = list(repo_root.glob("**/*.py"))
20
+
21
+ # Filter out files in excluded directories
22
+ filtered_files = []
23
+ for file_path in py_files:
24
+ relative_path = file_path.relative_to(repo_root)
25
+ path_parts = relative_path.parts
26
+
27
+ # Skip files in excluded directories
28
+ if any(part in excluded_parts for part in path_parts):
29
+ continue
30
+
31
+ # Skip files matching excluded patterns
32
+ if any(file_path.match(f"**/{pattern}/**") for pattern in excluded_patterns):
33
+ continue
34
+
35
+ # Skip __init__.py files if requested
36
+ if exclude_init and file_path.name == "__init__.py":
37
+ continue
38
+
39
+ filtered_files.append(str(relative_path))
40
+
41
+ return sorted(filtered_files)
42
+
43
+
44
+ def get_shell_files(repo_root: Path) -> list[str]:
45
+ """Get all shell script files relative to repo root."""
46
+ excluded_parts = {".venv", "__pycache__", ".git", "build", "dist"}
47
+ excluded_patterns = {"*.egg-info"}
48
+
49
+ # Get all .sh files recursively
50
+ sh_files = list(repo_root.glob("**/*.sh"))
51
+
52
+ # Filter out files in excluded directories
53
+ filtered_files = []
54
+ for file_path in sh_files:
55
+ relative_path = file_path.relative_to(repo_root)
56
+ path_parts = relative_path.parts
57
+
58
+ # Skip files in excluded directories
59
+ if any(part in excluded_parts for part in path_parts):
60
+ continue
61
+
62
+ # Skip files matching excluded patterns
63
+ if any(file_path.match(f"**/{pattern}/**") for pattern in excluded_patterns):
64
+ continue
65
+
66
+ filtered_files.append(str(relative_path))
67
+
68
+ return sorted(filtered_files)
69
+
70
+
71
+ def count_lines(file_path: Path) -> int:
72
+ """Count the number of lines in a file."""
73
+ try:
74
+ with open(file_path, 'r', encoding='utf-8') as f:
75
+ return sum(1 for _ in f)
76
+ except (IOError, UnicodeDecodeError):
77
+ return 0
78
+
79
+
80
+ def is_git_repository(path: Path) -> bool:
81
+ """Check if the given path is part of a git repository."""
82
+ try:
83
+ result = subprocess.run(
84
+ ["git", "rev-parse", "--git-dir"],
85
+ cwd=path,
86
+ capture_output=True,
87
+ text=True,
88
+ check=False
89
+ )
90
+ return result.returncode == 0
91
+ except (subprocess.SubprocessError, FileNotFoundError):
92
+ return False
93
+
94
+
95
+ def filter_files_by_name(files: list[str], pattern: str) -> list[str]:
96
+ """Filter files by filename containing the pattern."""
97
+ return [f for f in files if pattern in f]
98
+
99
+
100
+ def filter_files_by_content(repo_root: Path, files: list[str], keyword: str) -> list[str]:
101
+ """Filter files by content containing the keyword."""
102
+ filtered_files = []
103
+ for file_path in files:
104
+ full_path = repo_root / file_path
105
+ try:
106
+ with open(full_path, 'r', encoding='utf-8') as f:
107
+ content = f.read()
108
+ if keyword in content:
109
+ filtered_files.append(file_path)
110
+ except (IOError, UnicodeDecodeError):
111
+ # Skip files that can't be read
112
+ continue
113
+ return filtered_files
114
+
115
+
116
+ def generate_csv_content(python_files: list[str], shell_files: list[str], repo_root: Path, include_line_count: bool = False) -> str:
117
+ """Generate CSV content with file information."""
118
+ import csv
119
+ import io
120
+
121
+ output = io.StringIO()
122
+ writer = csv.writer(output)
123
+
124
+ # Write header
125
+ if include_line_count:
126
+ writer.writerow(["Type", "Index", "File Path", "Line Count", "Status"])
127
+ else:
128
+ writer.writerow(["Type", "Index", "File Path", "Status"])
129
+
130
+ # Write Python files
131
+ for index, file_path in enumerate(python_files, start=1):
132
+ clean_path = file_path.lstrip("./")
133
+ if include_line_count:
134
+ line_count = count_lines(repo_root / file_path)
135
+ writer.writerow(["Python", index, clean_path, line_count, "[ ]"])
136
+ else:
137
+ writer.writerow(["Python", index, clean_path, "[ ]"])
138
+
139
+ # Write shell files
140
+ for index, file_path in enumerate(shell_files, start=1):
141
+ clean_path = file_path.lstrip("./")
142
+ if include_line_count:
143
+ line_count = count_lines(repo_root / file_path)
144
+ writer.writerow(["Shell", index, clean_path, line_count, "[ ]"])
145
+ else:
146
+ writer.writerow(["Shell", index, clean_path, "[ ]"])
147
+
148
+ return output.getvalue()
149
+
150
+
151
+ def generate_txt_content(python_files: list[str], shell_files: list[str]) -> str:
152
+ """Generate plain text content with file paths."""
153
+ all_files = python_files + shell_files
154
+ return "\n".join(file.lstrip("./") for file in all_files)
155
+
156
+
157
+ def generate_markdown_table(python_files: list[str], shell_files: list[str], repo_root: Path, include_line_count: bool = False) -> str:
158
+ """Generate markdown table with checkboxes."""
159
+ header = "# File Checklist\n\n"
160
+
161
+ content = ""
162
+
163
+ if python_files:
164
+ content += "## Python Files\n\n"
165
+ if include_line_count:
166
+ # Calculate line counts and sort by descending line count
167
+ python_with_counts = [(file, count_lines(repo_root / file)) for file in python_files]
168
+ python_with_counts.sort(key=lambda x: x[1], reverse=True)
169
+ python_files = [file for file, _ in python_with_counts]
170
+
171
+ content += "| Index | File Path | Line Count | Status |\n|-------|-----------|------------|--------|\n"
172
+ else:
173
+ content += "| Index | File Path | Status |\n|-------|-----------|--------|\n"
174
+ for index, file_path in enumerate(python_files, start=1):
175
+ clean_path = file_path.lstrip("./")
176
+ if include_line_count:
177
+ line_count = count_lines(repo_root / file_path)
178
+ content += f"| {index} | {clean_path} | {line_count} | - [ ] |\n"
179
+ else:
180
+ content += f"| {index} | {clean_path} | - [ ] |\n"
181
+
182
+ if shell_files:
183
+ content += "\n## Shell Script Files\n\n"
184
+ if include_line_count:
185
+ # Calculate line counts and sort by descending line count
186
+ shell_with_counts = [(file, count_lines(repo_root / file)) for file in shell_files]
187
+ shell_with_counts.sort(key=lambda x: x[1], reverse=True)
188
+ shell_files = [file for file, _ in shell_with_counts]
189
+
190
+ content += "| Index | File Path | Line Count | Status |\n|-------|-----------|------------|--------|\n"
191
+ else:
192
+ content += "| Index | File Path | Status |\n|-------|-----------|--------|\n"
193
+ for index, file_path in enumerate(shell_files, start=1):
194
+ clean_path = file_path.lstrip("./")
195
+ if include_line_count:
196
+ line_count = count_lines(repo_root / file_path)
197
+ content += f"| {index} | {clean_path} | {line_count} | - [ ] |\n"
198
+ else:
199
+ content += f"| {index} | {clean_path} | - [ ] |\n"
200
+
201
+ return header + content
202
+
203
+
204
+ def split_files_into_chunks(all_files: list[str], split_every: Optional[int] = None, split_to: Optional[int] = None) -> list[list[str]]:
205
+ """Split files into chunks based on split_every or split_to."""
206
+ if split_every is not None:
207
+ # Split into chunks of split_every files each
208
+ return [all_files[i:i + split_every] for i in range(0, len(all_files), split_every)]
209
+ elif split_to is not None:
210
+ # Split into exactly split_to chunks
211
+ if split_to <= 0:
212
+ return [all_files]
213
+ chunk_size = max(1, len(all_files) // split_to)
214
+ chunks = []
215
+ for i in range(split_to):
216
+ start = i * chunk_size
217
+ end = start + chunk_size if i < split_to - 1 else len(all_files)
218
+ chunks.append(all_files[start:end])
219
+ return chunks
220
+ else:
221
+ # No splitting
222
+ return [all_files]
223
+
224
+
225
+ def generate_content(python_files: list[str], shell_files: list[str], repo_root: Path,
226
+ format_type: str, include_line_count: bool) -> str:
227
+ """Generate content based on format type."""
228
+ if format_type == "csv":
229
+ return generate_csv_content(python_files, shell_files, repo_root, include_line_count)
230
+ elif format_type == "md":
231
+ return generate_markdown_table(python_files, shell_files, repo_root, include_line_count)
232
+ elif format_type == "txt":
233
+ return generate_txt_content(python_files, shell_files)
234
+ else:
235
+ raise ValueError(f"Unsupported format: {format_type}")
236
+
237
+
238
+ def create_repo_symlinks(repo_root: Path) -> None:
239
+ """Create 5 symlinks to repo_root at ~/code_copies/${repo_name}_copy_{i}."""
240
+ repo_name: str = repo_root.name
241
+ symlink_dir: Path = Path.home() / "code_copies"
242
+ symlink_dir.mkdir(exist_ok=True)
243
+ for i in range(1, 6):
244
+ symlink_path: Path = symlink_dir / f"{repo_name}_copy_{i}"
245
+ if symlink_path.exists() or symlink_path.is_symlink():
246
+ symlink_path.unlink()
247
+ symlink_path.symlink_to(repo_root, target_is_directory=True)
248
+
249
+
250
+ def make_todo_files(
251
+ pattern: Annotated[str, typer.Argument(help="Pattern or keyword to match files by")],
252
+ repo: Annotated[str, typer.Argument(help="Repository path. Can be any directory within a git repository.")] = str(Path.cwd()),
253
+ strategy: Annotated[Literal["name", "keywords"], typer.Option("-s", "--strategy", help="Strategy to filter files: 'name' for filename matching, 'keywords' for content matching")] = "name",
254
+ exclude_init: Annotated[bool, typer.Option("-x", "--exclude-init", help="Exclude __init__.py files from the checklist")] = True,
255
+ include_line_count: Annotated[bool, typer.Option("-l", "--line-count", help="Include line count column in the output")] = False,
256
+ output_path: Annotated[str, typer.Option("-o", "--output-path", help="Base path for output files relative to repo root")] = ".ai/todo/files",
257
+ format_type: Annotated[Literal["csv", "md", "txt"], typer.Option("-f", "--format", help="Output format: csv, md (markdown), or txt")] = "md",
258
+ split_every: Annotated[Optional[int], typer.Option("--split-every", "-e", help="Split output into multiple files, each containing at most this many results")] = None,
259
+ split_to: Annotated[Optional[int], typer.Option("--split-to", "-t", help="Split output into exactly this many files")] = None,
260
+ ) -> None:
261
+ """Generate checklist with Python and shell script files in the repository filtered by pattern."""
262
+ repo_path = Path(repo).expanduser().absolute()
263
+ if not is_git_repository(repo_path):
264
+ console = Console()
265
+ console.print(Panel(f"❌ ERROR | Not a git repository or not in a git repository: {repo_path}", border_style="bold red", expand=False))
266
+ raise typer.Exit(code=1)
267
+
268
+ # Delete .ai/todo directory at the start
269
+ todo_dir = repo_path / ".ai" / "todo"
270
+ if todo_dir.exists():
271
+ shutil.rmtree(todo_dir)
272
+
273
+ output_base = repo_path / output_path
274
+
275
+ # Ensure output directory exists
276
+ output_base.parent.mkdir(parents=True, exist_ok=True)
277
+
278
+ # Get Python and shell files
279
+ python_files = get_python_files(repo_path, exclude_init=exclude_init)
280
+ shell_files = get_shell_files(repo_path)
281
+
282
+ # Apply filtering based on strategy
283
+ if strategy == "name":
284
+ python_files = filter_files_by_name(python_files, pattern)
285
+ shell_files = filter_files_by_name(shell_files, pattern)
286
+ elif strategy == "keywords":
287
+ python_files = filter_files_by_content(repo_path, python_files, pattern)
288
+ shell_files = filter_files_by_content(repo_path, shell_files, pattern)
289
+
290
+ print(f"Repo path: {repo_path}")
291
+ print(f"Strategy: {strategy}")
292
+ print(f"Pattern: {pattern}")
293
+ print(f"Format: {format_type}")
294
+ print(f"Found {len(python_files)} Python files")
295
+ print(f"Found {len(shell_files)} Shell script files")
296
+
297
+ # Combine all files for splitting
298
+ all_files = python_files + shell_files
299
+
300
+ # Split files into chunks
301
+ file_chunks = split_files_into_chunks(all_files, split_every, split_to)
302
+
303
+ # Determine file extension based on format
304
+ extension = {"csv": ".csv", "md": ".md", "txt": ".txt"}[format_type]
305
+
306
+ output_files = []
307
+ for i, chunk in enumerate(file_chunks):
308
+ # Split chunk back into python and shell files
309
+ chunk_python = [f for f in chunk if f in python_files]
310
+ chunk_shell = [f for f in chunk if f in shell_files]
311
+
312
+ # Generate content for this chunk
313
+ content = generate_content(chunk_python, chunk_shell, repo_path, format_type, include_line_count)
314
+
315
+ # Determine output file path
316
+ if len(file_chunks) == 1:
317
+ output_file = output_base.with_suffix(extension)
318
+ else:
319
+ output_file = output_base.parent / f"{output_base.name}_{i+1}{extension}"
320
+
321
+ # Write to file
322
+ output_file.write_text(content)
323
+ output_files.append(output_file)
324
+
325
+ console = Console()
326
+ success_msg = f"""✅ SUCCESS | Files generated successfully!
327
+ 📄 Output files: {', '.join(str(f.relative_to(repo_path)) for f in output_files)}
328
+ 🐍 Python files: {len(python_files)}
329
+ 🔧 Shell files: {len(shell_files)}
330
+ 📊 Total chunks: {len(file_chunks)}"""
331
+
332
+ console.print(Panel(success_msg, border_style="bold blue", expand=False))
333
+
334
+
335
+ def create_symlink_command(num: Annotated[int, typer.Argument(help="Number of symlinks to create (1-5).")] = 5) -> None:
336
+ """Create 5 symlinks to repo_root at ~/code_copies/${repo_name}_copy_{i}."""
337
+ if num < 1 or num > 5:
338
+ console = Console()
339
+ console.print(Panel("❌ ERROR | Number of symlinks must be between 1 and 5.", border_style="bold red", expand=False))
340
+ raise typer.Exit(code=1)
341
+ repo_root = Path.cwd().absolute()
342
+ create_repo_symlinks(repo_root)
343
+ console = Console()
344
+ console.print(Panel(f"✅ SUCCESS | Created {num} symlinks to {repo_root} in ~/code_copies/", border_style="bold green", expand=False))
345
+
346
+ if __name__ == "__main__":
347
+ typer.run(make_todo_files)
348
+ # typer.run(create_symlink_command)
@@ -0,0 +1,37 @@
1
+ import json
2
+ from pathlib import Path
3
+ from typing import Any
4
+
5
+
6
+ def add_lint_and_type_check_task(repo_root: Path) -> None:
7
+ vscode_dir = repo_root / ".vscode"
8
+ vscode_dir.mkdir(parents=True, exist_ok=True)
9
+ tasks_json_path = vscode_dir / "tasks.json"
10
+
11
+ task_to_add = {
12
+ "label": "lint_and_type_check",
13
+ "type": "shell",
14
+ "linux": {"command": "bash", "args": ["./.ai/scripts/lint_and_type_check.sh"]},
15
+ "osx": {"command": "bash", "args": ["./.ai/scripts/lint_and_type_check.sh"]},
16
+ "windows": {"command": "pwsh", "args": ["-File", "./.ai/scripts/lint_and_type_check.ps1"]},
17
+ "presentation": {"reveal": "always", "panel": "new"},
18
+ "problemMatcher": [],
19
+ }
20
+
21
+ if tasks_json_path.exists():
22
+ json_data = tasks_json_path.read_text(encoding="utf-8")
23
+ if not json_data.strip():
24
+ tasks_config: dict[str, Any] = {"version": "2.0.0", "tasks": []}
25
+ else:
26
+ tasks_config = json.loads(json_data)
27
+ assert isinstance(tasks_config, dict)
28
+ if "tasks" not in tasks_config:
29
+ tasks_config["tasks"] = []
30
+ existing_labels = {task.get("label") for task in tasks_config.get("tasks", [])}
31
+ if "lintAndTypeCheck" not in existing_labels:
32
+ tasks_config["tasks"].append(task_to_add)
33
+ else:
34
+ tasks_config = {"version": "2.0.0", "tasks": [task_to_add]}
35
+
36
+ with tasks_json_path.open("w") as f:
37
+ json.dump(tasks_config, f, indent="\t")
@@ -0,0 +1,29 @@
1
+
2
+ import typer
3
+ from machineconfig.scripts.python.helpers_cloud.cloud_sync import main as sync_main
4
+ from machineconfig.scripts.python.helpers_cloud.cloud_copy import main as copy_main
5
+ from machineconfig.scripts.python.helpers_cloud.cloud_mount import mount as mount_main
6
+
7
+ def get_app():
8
+ app = typer.Typer(add_completion=False, no_args_is_help=True)
9
+
10
+ app.command(name="sync", no_args_is_help=True, help="""🔄 [s] Synchronize files/folders between local and cloud storage.""")(sync_main)
11
+ app.command(name="s", no_args_is_help=True, hidden=True)(sync_main) # short alias
12
+
13
+ app.command(name="copy", no_args_is_help=True, short_help="""📤 [c] Upload or 📥 Download files/folders to/from cloud storage services like Google Drive, Dropbox, OneDrive, etc.""")(copy_main)
14
+ app.command(name="c", no_args_is_help=True, hidden=True)(copy_main) # short alias
15
+
16
+ app.command(name="mount", no_args_is_help=True, short_help="""🔗 [m] Mount cloud storage services like Google Drive, Dropbox, OneDrive, etc. as local drives.""")(mount_main)
17
+ app.command(name="m", no_args_is_help=True, hidden=True)(mount_main) # short alias
18
+
19
+ return app
20
+
21
+
22
+ def main():
23
+ app = get_app()
24
+ app()
25
+
26
+
27
+ if __name__ == "__main__":
28
+ pass
29
+ # a = get_app()(asdf)