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,22 +1,39 @@
1
1
  #!/usr/bin/env python3
2
- """Script to generate a markdown table with checkboxes for all Python files in the repo."""
2
+ """Script to generate a markdown table with checkboxes for all Python and shell files in the repo."""
3
3
 
4
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
5
11
 
6
12
 
7
- def get_python_files(repo_root: Path) -> list[str]:
13
+ def get_python_files(repo_root: Path, exclude_init: bool = False) -> list[str]:
8
14
  """Get all Python files relative to repo root."""
15
+ excluded_parts = {".venv", "__pycache__", ".git", "build", "dist", ".ai"}
16
+ excluded_patterns = {"*.egg-info"}
17
+
9
18
  # Get all .py files recursively
10
19
  py_files = list(repo_root.glob("**/*.py"))
11
20
 
12
- # Filter out files in .venv and __pycache__ directories
21
+ # Filter out files in excluded directories
13
22
  filtered_files = []
14
23
  for file_path in py_files:
15
24
  relative_path = file_path.relative_to(repo_root)
16
25
  path_parts = relative_path.parts
17
26
 
18
- # Skip files in .venv or __pycache__ directories
19
- if any(part in {".venv", "__pycache__"} for part in path_parts):
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":
20
37
  continue
21
38
 
22
39
  filtered_files.append(str(relative_path))
@@ -24,60 +41,308 @@ def get_python_files(repo_root: Path) -> list[str]:
24
41
  return sorted(filtered_files)
25
42
 
26
43
 
27
- def generate_markdown_table(files: list[str]) -> str:
28
- """Generate markdown table with checkboxes."""
29
- header = "# Python Files Checklist\n\n"
30
- table = "| Index | File Path | Status |\n|-------|-----------|--------|\n"
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
+
31
99
 
32
- for index, file_path in enumerate(files, start=1):
33
- # Remove leading ./ if present
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):
34
132
  clean_path = file_path.lstrip("./")
35
- table += f"| {index} | {clean_path} | - [ ] |\n"
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()
36
149
 
37
- return header + table
38
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)
39
155
 
40
- def main() -> None:
41
- """Main function."""
42
- repo_root = Path.cwd()
43
- if not repo_root.joinpath("pyproject.toml").exists():
44
- raise RuntimeError(f" {repo_root} Not a repo root")
45
- output_file = repo_root / ".ai" / "all_files_with_index.md"
46
156
 
47
- print(f"Repo root: {repo_root}")
48
- print(f"Output file: {output_file}")
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"
49
160
 
50
- # Ensure output directory exists
51
- output_file.parent.mkdir(parents=True, exist_ok=True)
161
+ content = ""
52
162
 
53
- # Get Python files
54
- python_files = get_python_files(repo_root)
55
- print(f"Found {len(python_files)} Python files")
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
56
202
 
57
- # Generate markdown
58
- markdown_content = generate_markdown_table(python_files)
59
- print(f"Generated markdown content length: {len(markdown_content)}")
60
203
 
61
- # Write to file
62
- output_file.write_text(markdown_content)
63
- print(f"Generated {output_file} with {len(python_files)} Python files")
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]
64
223
 
65
- # Create 5 symlinks to repo_root at ~/code_copies/${repo_name}_copy_{i}
66
- import pathlib
67
224
 
68
- # import os
69
- repo_root = pathlib.Path.cwd().resolve()
70
- repo_name: str = pathlib.Path(repo_root).name
71
- symlink_dir: pathlib.Path = pathlib.Path.home() / "code_copies"
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"
72
242
  symlink_dir.mkdir(exist_ok=True)
73
243
  for i in range(1, 6):
74
- symlink_path: pathlib.Path = symlink_dir / f"{repo_name}_copy_{i}"
244
+ symlink_path: Path = symlink_dir / f"{repo_name}_copy_{i}"
75
245
  if symlink_path.exists() or symlink_path.is_symlink():
76
246
  symlink_path.unlink()
77
247
  symlink_path.symlink_to(repo_root, target_is_directory=True)
78
- # Windows equivalent (comment):
79
- # for /l %i in (1,1,5) do mklink /D "%USERPROFILE%\code_copies\{repo_name}_copy_%i" "C:\path\to\repo_root"
80
248
 
81
249
 
250
+ def main(
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
+
82
346
  if __name__ == "__main__":
83
- main()
347
+ typer.run(main)
348
+ # typer.run(create_symlink_command)
@@ -7,6 +7,7 @@ from machineconfig.scripts.python.ai.solutions.copilot import github_copilot
7
7
  from machineconfig.scripts.python.ai.solutions.crush import crush
8
8
  from machineconfig.scripts.python.ai.solutions.cursor import cursors
9
9
  from machineconfig.scripts.python.ai.solutions.gemini import gemini
10
+ from machineconfig.scripts.python.ai.vscode_tasks import add_lint_and_type_check_task
10
11
  from machineconfig.utils.accessories import get_repo_root
11
12
 
12
13
 
@@ -14,25 +15,6 @@ def add_ai_configs(repo_root: Path) -> None:
14
15
  repo_root_resolved = get_repo_root(repo_root)
15
16
  if repo_root_resolved is not None:
16
17
  repo_root = repo_root_resolved # this means you can run the command from any subdirectory of the repo.
17
-
18
- if repo_root.joinpath("pyproject.toml").exists() is False:
19
- uv_init = input(f"{repo_root} does not seem to be a python project (no pyproject.toml found), would you like to initialize one? (y/n) ")
20
- if uv_init.strip().lower() == "y":
21
- command_to_run = """
22
- uv init --python 3.13
23
- uv venv
24
- uv add --upgrade-package pylint pyright mypy pyrefly ty --dev # linters and type checkers
25
- uv add --upgrade-package pytest --dev
26
- # uv add typer --dev
27
-
28
- """
29
- import subprocess
30
-
31
- subprocess.run(command_to_run, shell=True, check=True)
32
- else:
33
- print("Terminating initai ...")
34
- return
35
-
36
18
  dot_ai_dir = repo_root.joinpath(".ai")
37
19
  dot_ai_dir.mkdir(parents=True, exist_ok=True)
38
20
  dot_scripts_dir = repo_root.joinpath(".scripts")
@@ -40,6 +22,8 @@ uv add --upgrade-package pytest --dev
40
22
  generic.create_dot_scripts(repo_root=repo_root)
41
23
  generic.adjust_gitignore(repo_root=repo_root)
42
24
 
25
+ add_lint_and_type_check_task(repo_root=repo_root)
26
+
43
27
  github_copilot.build_configuration(repo_root=repo_root)
44
28
  cursors.build_configuration(repo_root=repo_root)
45
29
  gemini.build_configuration(repo_root=repo_root)
@@ -47,12 +31,3 @@ uv add --upgrade-package pytest --dev
47
31
  crush.build_configuration(repo_root=repo_root)
48
32
  cline.build_configuration(repo_root=repo_root)
49
33
 
50
-
51
-
52
- def main() -> None:
53
- repo_root = Path.cwd()
54
- add_ai_configs(repo_root=repo_root)
55
-
56
-
57
- if __name__ == "__main__":
58
- add_ai_configs(repo_root=Path.cwd())
@@ -66,9 +66,8 @@ uv run -m cleanpy .
66
66
  uv run -m ruff clean
67
67
  # uv run -m ruff format .
68
68
  uv run -m ruff check . --fix
69
- uv run --no-dev --project $HOME/code/machineconfig -m machineconfig.scripts.python.ai.generate_files
70
69
 
71
- New-Item -ItemType Directory -Force -Path .linters | Out-Null
70
+ New-Item -ItemType Directory -Force -Path .ai/linters | Out-Null
72
71
 
73
72
  Write-Host "${GREEN}🧹 Code cleanup complete!${NC}"
74
73
  Write-Host
@@ -78,38 +77,38 @@ Draw-Box "🔍 TYPE CHECKERS & LINTERS 🔍" "${BOLD}${PURPLE}"
78
77
  $CURRENT_STEP++
79
78
  Draw-Progress $CURRENT_STEP $TOTAL_STEPS "Pyright Type Checker"
80
79
  Write-Host "${BLUE}📋 Analyzing types with Pyright...${NC}"
81
- Remove-Item ./.linters/pyright_result.md -ErrorAction SilentlyContinue
82
- uv run pyright . | Out-File -FilePath ./.linters/pyright_result.md
83
- Write-Host "${GREEN}✅ Results saved to ${UNDERLINE}./.linters/pyright_result.md${NC}"
80
+ Remove-Item ./.ai/linters/issues_pyright.md -ErrorAction SilentlyContinue
81
+ uv run pyright . | Out-File -FilePath ./.ai/linters/issues_pyright.md
82
+ Write-Host "${GREEN}✅ Results saved to ${UNDERLINE}./.ai/linters/issues_pyright.md${NC}"
84
83
 
85
84
  $CURRENT_STEP++
86
85
  Draw-Progress $CURRENT_STEP $TOTAL_STEPS "MyPy Type Checker"
87
86
  Write-Host "${BLUE}📋 Analyzing types with MyPy...${NC}"
88
- Remove-Item ./.linters/mypy_result.md -ErrorAction SilentlyContinue
89
- uv run mypy . | Out-File -FilePath ./.linters/mypy_result.md
90
- Write-Host "${GREEN}✅ Results saved to ${UNDERLINE}./.linters/mypy_result.md${NC}"
87
+ Remove-Item ./.ai/linters/issues_mypy.md -ErrorAction SilentlyContinue
88
+ uv run mypy . | Out-File -FilePath ./.ai/linters/issues_mypy.md
89
+ Write-Host "${GREEN}✅ Results saved to ${UNDERLINE}./.ai/linters/issues_mypy.md${NC}"
91
90
 
92
91
  $CURRENT_STEP++
93
92
  Draw-Progress $CURRENT_STEP $TOTAL_STEPS "Pylint Code Analysis"
94
93
  Write-Host "${BLUE}📋 Analyzing code quality with Pylint...${NC}"
95
- Remove-Item ./.linters/pylint_result.md -ErrorAction SilentlyContinue
96
- uv run pylint ./src/ | Out-File -FilePath ./.linters/pylint_result.md
97
- Write-Host "${GREEN}✅ Results saved to ${UNDERLINE}./.linters/pylint_result.md${NC}"
94
+ Remove-Item ./.ai/linters/issues_pylint.md -ErrorAction SilentlyContinue
95
+ uv run pylint ./src/ | Out-File -FilePath ./.ai/linters/issues_pylint.md
96
+ Write-Host "${GREEN}✅ Results saved to ${UNDERLINE}./.ai/linters/issues_pylint.md${NC}"
98
97
 
99
98
  $CURRENT_STEP++
100
99
  Draw-Progress $CURRENT_STEP $TOTAL_STEPS "Pyrefly Type Checker"
101
100
  Write-Host "${BLUE}📋 Analyzing types with Pyrefly...${NC}"
102
- Remove-Item ./.linters/pyrefly_result.md -ErrorAction SilentlyContinue
103
- uv run pyrefly check . | Out-File -FilePath ./.linters/pyrefly_result.md
104
- Write-Host "${GREEN}✅ Results saved to ${UNDERLINE}./.linters/pyrefly_result.md${NC}"
101
+ Remove-Item ./.ai/linters/issues_pyrefly.md -ErrorAction SilentlyContinue
102
+ uv run pyrefly check . | Out-File -FilePath ./.ai/linters/issues_pyrefly.md
103
+ Write-Host "${GREEN}✅ Results saved to ${UNDERLINE}./.ai/linters/issues_pyrefly.md${NC}"
105
104
 
106
105
  $CURRENT_STEP++
107
106
  Draw-Progress $CURRENT_STEP $TOTAL_STEPS "Ruff Linter"
108
107
  Write-Host "${BLUE}📋 Checking code style with Ruff...${NC}"
109
- Remove-Item ./.linters/ruff_result.md -ErrorAction SilentlyContinue
110
- uv run ruff check . | Out-File -FilePath ./.linters/ruff_result.md
111
- Write-Host "${GREEN}✅ Results saved to ${UNDERLINE}./.linters/ruff_result.md${NC}"
108
+ Remove-Item ./.ai/linters/issues_ruff.md -ErrorAction SilentlyContinue
109
+ uv run ruff check . | Out-File -FilePath ./.ai/linters/issues_ruff.md
110
+ Write-Host "${GREEN}✅ Results saved to ${UNDERLINE}./.ai/linters/issues_ruff.md${NC}"
112
111
 
113
112
  Write-Host
114
113
  Draw-Box "🎉 ALL CHECKS COMPLETED! 🎉" "${BOLD}${GREEN}"
115
- Write-Host "${BOLD}${GREEN}📁 Check the ${UNDERLINE}.linters${NC}${BOLD}${GREEN} directory for detailed results.${NC}"
114
+ Write-Host "${BOLD}${GREEN}📁 Check the ${UNDERLINE}.ai/linters${NC}${BOLD}${GREEN} directory for detailed results.${NC}"
@@ -70,9 +70,8 @@ uv run -m cleanpy .
70
70
  uv run -m ruff clean
71
71
  # uv run -m ruff format .
72
72
  uv run -m ruff check . --fix
73
- uv run --no-dev --project $HOME/code/machineconfig -m machineconfig.scripts.python.ai.generate_files
74
73
 
75
- mkdir .linters
74
+ mkdir .ai/linters
76
75
 
77
76
  echo -e "${GREEN}🧹 Code cleanup complete!${NC}"
78
77
  echo
@@ -82,38 +81,38 @@ draw_box "🔍 TYPE CHECKERS & LINTERS 🔍" "${BOLD}${PURPLE}"
82
81
  ((CURRENT_STEP++))
83
82
  draw_progress $CURRENT_STEP $TOTAL_STEPS "Pyright Type Checker"
84
83
  echo -e "${BLUE}📋 Analyzing types with Pyright...${NC}"
85
- rm ./.linters/pyright_result.md || true
86
- uv run pyright . > ./.linters/pyright_result.md
87
- echo -e "${GREEN}✅ Results saved to ${UNDERLINE}./.linters/pyright_result.md${NC}"
84
+ rm ./.ai/linters/issues_pyright.md || true
85
+ uv run pyright . > ./.ai/linters/issues_pyright.md
86
+ echo -e "${GREEN}✅ Results saved to ${UNDERLINE}./.ai/linters/issues_pyright.md${NC}"
88
87
 
89
88
  ((CURRENT_STEP++))
90
89
  draw_progress $CURRENT_STEP $TOTAL_STEPS "MyPy Type Checker"
91
90
  echo -e "${BLUE}📋 Analyzing types with MyPy...${NC}"
92
- rm ./.linters/mypy_result.md || true
93
- uv run mypy . > ./.linters/mypy_result.md
94
- echo -e "${GREEN}✅ Results saved to ${UNDERLINE}./.linters/mypy_result.md${NC}"
91
+ rm ./.ai/linters/issues_mypy.md || true
92
+ uv run mypy . > ./.ai/linters/issues_mypy.md
93
+ echo -e "${GREEN}✅ Results saved to ${UNDERLINE}./.ai/linters/issues_mypy.md${NC}"
95
94
 
96
95
  ((CURRENT_STEP++))
97
96
  draw_progress $CURRENT_STEP $TOTAL_STEPS "Pylint Code Analysis"
98
97
  echo -e "${BLUE}📋 Analyzing code quality with Pylint...${NC}"
99
- rm ./.linters/pylint_result.md || true
100
- uv run pylint ./src/ > ./.linters/pylint_result.md
101
- echo -e "${GREEN}✅ Results saved to ${UNDERLINE}./.linters/pylint_result.md${NC}"
98
+ rm ./.ai/linters/issues_pylint.md || true
99
+ uv run pylint ./src/ > ./.ai/linters/issues_pylint.md
100
+ echo -e "${GREEN}✅ Results saved to ${UNDERLINE}./.ai/linters/issues_pylint.md${NC}"
102
101
 
103
102
  ((CURRENT_STEP++))
104
103
  draw_progress $CURRENT_STEP $TOTAL_STEPS "Pyrefly Type Checker"
105
104
  echo -e "${BLUE}📋 Analyzing types with Pyrefly...${NC}"
106
- rm ./.linters/pyrefly_result.md || true
107
- uv run pyrefly check . > ./.linters/pyrefly_result.md
108
- echo -e "${GREEN}✅ Results saved to ${UNDERLINE}./.linters/pyrefly_result.md${NC}"
105
+ rm ./.ai/linters/issues_pyrefly.md || true
106
+ uv run pyrefly check . > ./.ai/linters/issues_pyrefly.md
107
+ echo -e "${GREEN}✅ Results saved to ${UNDERLINE}./.ai/linters/issues_pyrefly.md${NC}"
109
108
 
110
109
  ((CURRENT_STEP++))
111
110
  draw_progress $CURRENT_STEP $TOTAL_STEPS "Ruff Linter"
112
111
  echo -e "${BLUE}📋 Checking code style with Ruff...${NC}"
113
- rm ./.linters/ruff_result.md || true
114
- uv run ruff check . > ./.linters/ruff_result.md
115
- echo -e "${GREEN}✅ Results saved to ${UNDERLINE}./.linters/ruff_result.md${NC}"
112
+ rm ./.ai/linters/issues_ruff.md || true
113
+ uv run ruff check . > ./.ai/linters/issues_ruff.md
114
+ echo -e "${GREEN}✅ Results saved to ${UNDERLINE}./.ai/linters/issues_ruff.md${NC}"
116
115
 
117
116
  echo
118
117
  draw_box "🎉 ALL CHECKS COMPLETED! 🎉" "${BOLD}${GREEN}"
119
- echo -e "${BOLD}${GREEN}📁 Check the ${UNDERLINE}.linters${NC}${BOLD}${GREEN} directory for detailed results.${NC}"
118
+ echo -e "${BOLD}${GREEN}📁 Check the ${UNDERLINE}.ai/linters${NC}${BOLD}${GREEN} directory for detailed results.${NC}"
@@ -2,4 +2,12 @@ from pathlib import Path
2
2
  from machineconfig.utils.source_of_truth import LIBRARY_ROOT
3
3
 
4
4
  def get_generic_instructions_path() -> Path:
5
- return LIBRARY_ROOT.joinpath("scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md")
5
+ path = LIBRARY_ROOT.joinpath("scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md")
6
+ text = path.read_text(encoding="utf-8")
7
+ import platform
8
+ if platform.system().lower() == "windows":
9
+ text = text.replace("bash", "powershell").replace(".sh", ".ps1")
10
+ import tempfile
11
+ temp_path = Path(tempfile.gettempdir()).joinpath("generic_instructions.md")
12
+ temp_path.write_text(data=text, encoding="utf-8")
13
+ return temp_path
@@ -34,7 +34,7 @@ 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.
@@ -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
+