machineconfig 1.95__py3-none-any.whl → 1.96__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 (499) hide show
  1. machineconfig/cluster/cloud_manager.py +445 -343
  2. machineconfig/cluster/data_transfer.py +63 -57
  3. machineconfig/cluster/distribute.py +284 -280
  4. machineconfig/cluster/file_manager.py +234 -237
  5. machineconfig/cluster/job_params.py +133 -133
  6. machineconfig/cluster/loader_runner.py +183 -149
  7. machineconfig/cluster/remote_machine.py +269 -252
  8. machineconfig/cluster/script_execution.py +215 -209
  9. machineconfig/cluster/script_notify_upon_completion.py +50 -43
  10. machineconfig/cluster/self_ssh.py +52 -54
  11. machineconfig/cluster/sessions_managers/__init__.py +0 -0
  12. machineconfig/cluster/sessions_managers/archive/__init__.py +0 -0
  13. machineconfig/{jobs/python → cluster/sessions_managers/archive}/create_zellij_template.py +5 -3
  14. machineconfig/cluster/sessions_managers/archive/session_managers.py +184 -0
  15. machineconfig/cluster/sessions_managers/demo_rich_zellij.py +0 -0
  16. machineconfig/cluster/sessions_managers/enhanced_command_runner.py +160 -0
  17. machineconfig/cluster/sessions_managers/wt_local.py +494 -0
  18. machineconfig/cluster/sessions_managers/wt_local_manager.py +577 -0
  19. machineconfig/cluster/sessions_managers/wt_remote.py +288 -0
  20. machineconfig/cluster/sessions_managers/wt_remote_manager.py +483 -0
  21. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +196 -0
  22. machineconfig/cluster/sessions_managers/wt_utils/process_monitor.py +418 -0
  23. machineconfig/cluster/sessions_managers/wt_utils/remote_executor.py +175 -0
  24. machineconfig/cluster/sessions_managers/wt_utils/session_manager.py +300 -0
  25. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +228 -0
  26. machineconfig/cluster/sessions_managers/zellij_local.py +418 -0
  27. machineconfig/cluster/sessions_managers/zellij_local_manager.py +533 -0
  28. machineconfig/cluster/sessions_managers/zellij_remote.py +229 -0
  29. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +188 -0
  30. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +64 -0
  31. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +126 -0
  32. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +334 -0
  33. machineconfig/cluster/sessions_managers/zellij_utils/remote_executor.py +68 -0
  34. machineconfig/cluster/sessions_managers/zellij_utils/session_manager.py +119 -0
  35. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +85 -0
  36. machineconfig/cluster/templates/cli_click.py +0 -1
  37. machineconfig/cluster/templates/cli_gooey.py +102 -104
  38. machineconfig/cluster/templates/run_cloud.py +51 -51
  39. machineconfig/cluster/templates/run_cluster.py +103 -59
  40. machineconfig/cluster/templates/run_remote.py +57 -58
  41. machineconfig/cluster/templates/utils.py +69 -36
  42. machineconfig/jobs/__pycache__/__init__.cpython-311.pyc +0 -0
  43. machineconfig/jobs/python/__pycache__/__init__.cpython-311.pyc +0 -0
  44. machineconfig/jobs/python/check_installations.py +258 -190
  45. machineconfig/jobs/python/create_bootable_media.py +7 -3
  46. machineconfig/jobs/python/python_cargo_build_share.py +50 -50
  47. machineconfig/jobs/python/python_ve_symlink.py +6 -6
  48. machineconfig/jobs/python/vscode/__pycache__/select_interpreter.cpython-311.pyc +0 -0
  49. machineconfig/jobs/python/vscode/api.py +1 -1
  50. machineconfig/jobs/python/vscode/link_ve.py +2 -2
  51. machineconfig/jobs/python/vscode/select_interpreter.py +9 -5
  52. machineconfig/jobs/python/vscode/sync_code.py +8 -5
  53. machineconfig/jobs/python_custom_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  54. machineconfig/jobs/python_custom_installers/archive/ngrok.py +1 -1
  55. machineconfig/jobs/python_custom_installers/dev/alacritty.py +3 -2
  56. machineconfig/jobs/python_custom_installers/dev/brave.py +7 -3
  57. machineconfig/jobs/python_custom_installers/dev/bypass_paywall.py +3 -4
  58. machineconfig/jobs/python_custom_installers/dev/code.py +3 -1
  59. machineconfig/jobs/python_custom_installers/dev/cursor.py +66 -5
  60. machineconfig/jobs/python_custom_installers/dev/docker_desktop.py +0 -1
  61. machineconfig/jobs/python_custom_installers/dev/espanso.py +13 -9
  62. machineconfig/jobs/python_custom_installers/dev/goes.py +2 -8
  63. machineconfig/jobs/python_custom_installers/dev/lvim.py +3 -2
  64. machineconfig/jobs/python_custom_installers/dev/nerdfont.py +1 -1
  65. machineconfig/jobs/python_custom_installers/dev/redis.py +7 -3
  66. machineconfig/jobs/python_custom_installers/dev/wezterm.py +8 -4
  67. machineconfig/jobs/python_custom_installers/dev/winget.py +194 -0
  68. machineconfig/jobs/python_custom_installers/{dev/docker.py → docker.py} +8 -3
  69. machineconfig/jobs/python_custom_installers/gh.py +4 -3
  70. machineconfig/jobs/python_custom_installers/hx.py +9 -8
  71. machineconfig/jobs/python_custom_installers/scripts/linux/vscode.sh +97 -30
  72. machineconfig/jobs/python_custom_installers/{dev/warp-cli.py → warp-cli.py} +1 -1
  73. machineconfig/jobs/python_generic_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  74. machineconfig/jobs/python_generic_installers/config.json +133 -9
  75. machineconfig/jobs/python_generic_installers/dev/config.json +208 -37
  76. machineconfig/jobs/python_generic_installers/update.py +3 -0
  77. machineconfig/jobs/python_linux_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  78. machineconfig/jobs/python_linux_installers/config.json +42 -6
  79. machineconfig/jobs/python_linux_installers/dev/config.json +79 -11
  80. machineconfig/jobs/python_windows_installers/config.json +6 -0
  81. machineconfig/profile/__pycache__/__init__.cpython-311.pyc +0 -0
  82. machineconfig/profile/__pycache__/create.cpython-311.pyc +0 -0
  83. machineconfig/profile/__pycache__/shell.cpython-311.pyc +0 -0
  84. machineconfig/profile/create.py +5 -5
  85. machineconfig/profile/create_hardlinks.py +5 -5
  86. machineconfig/profile/shell.py +44 -17
  87. machineconfig/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  88. machineconfig/scripts/__pycache__/__init__.cpython-313.pyc +0 -0
  89. machineconfig/scripts/linux/fire_agents +27 -0
  90. machineconfig/scripts/linux/wifi_conn +24 -0
  91. machineconfig/scripts/python/__pycache__/__init__.cpython-311.pyc +0 -0
  92. machineconfig/scripts/python/__pycache__/__init__.cpython-313.pyc +0 -0
  93. machineconfig/scripts/python/__pycache__/cloud_copy.cpython-311.pyc +0 -0
  94. machineconfig/scripts/python/__pycache__/cloud_mount.cpython-311.pyc +0 -0
  95. machineconfig/scripts/python/__pycache__/cloud_sync.cpython-311.pyc +0 -0
  96. machineconfig/scripts/python/__pycache__/croshell.cpython-311.pyc +0 -0
  97. machineconfig/scripts/python/__pycache__/devops.cpython-311.pyc +0 -0
  98. machineconfig/scripts/python/__pycache__/devops_backup_retrieve.cpython-311.pyc +0 -0
  99. machineconfig/scripts/python/__pycache__/devops_devapps_install.cpython-311.pyc +0 -0
  100. machineconfig/scripts/python/__pycache__/devops_update_repos.cpython-311.pyc +0 -0
  101. machineconfig/scripts/python/__pycache__/fire_agents.cpython-311.pyc +0 -0
  102. machineconfig/scripts/python/__pycache__/fire_jobs.cpython-311.pyc +0 -0
  103. machineconfig/scripts/python/__pycache__/fire_jobs.cpython-313.pyc +0 -0
  104. machineconfig/scripts/python/__pycache__/get_zellij_cmd.cpython-311.pyc +0 -0
  105. machineconfig/scripts/python/__pycache__/repos.cpython-311.pyc +0 -0
  106. machineconfig/scripts/python/archive/im2text.py +1 -3
  107. machineconfig/scripts/python/choose_wezterm_theme.py +3 -3
  108. machineconfig/scripts/python/cloud_copy.py +10 -10
  109. machineconfig/scripts/python/cloud_manager.py +77 -99
  110. machineconfig/scripts/python/cloud_mount.py +13 -12
  111. machineconfig/scripts/python/cloud_repo_sync.py +14 -11
  112. machineconfig/scripts/python/croshell.py +24 -21
  113. machineconfig/scripts/python/devops.py +12 -17
  114. machineconfig/scripts/python/devops_add_identity.py +32 -10
  115. machineconfig/scripts/python/devops_add_ssh_key.py +10 -10
  116. machineconfig/scripts/python/devops_backup_retrieve.py +9 -8
  117. machineconfig/scripts/python/devops_devapps_install.py +6 -6
  118. machineconfig/scripts/python/devops_update_repos.py +4 -3
  119. machineconfig/scripts/python/dotfile.py +10 -7
  120. machineconfig/scripts/python/fire_agents.py +69 -0
  121. machineconfig/scripts/python/fire_jobs.py +56 -65
  122. machineconfig/scripts/python/ftpx.py +8 -8
  123. machineconfig/scripts/python/get_zellij_cmd.py +3 -3
  124. machineconfig/scripts/python/gh_models.py +6 -4
  125. machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-311.pyc +0 -0
  126. machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-313.pyc +0 -0
  127. machineconfig/scripts/python/helpers/__pycache__/cloud_helpers.cpython-311.pyc +0 -0
  128. machineconfig/scripts/python/helpers/__pycache__/helpers2.cpython-311.pyc +0 -0
  129. machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-311.pyc +0 -0
  130. machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-313.pyc +0 -0
  131. machineconfig/scripts/python/helpers/__pycache__/repo_sync_helpers.cpython-311.pyc +0 -0
  132. machineconfig/scripts/python/helpers/cloud_helpers.py +12 -12
  133. machineconfig/scripts/python/helpers/helpers2.py +9 -8
  134. machineconfig/scripts/python/helpers/helpers4.py +23 -35
  135. machineconfig/scripts/python/helpers/repo_sync_helpers.py +17 -16
  136. machineconfig/scripts/python/mount_nfs.py +8 -11
  137. machineconfig/scripts/python/mount_nw_drive.py +4 -4
  138. machineconfig/scripts/python/mount_ssh.py +2 -2
  139. machineconfig/scripts/python/onetimeshare.py +56 -57
  140. machineconfig/scripts/python/pomodoro.py +55 -55
  141. machineconfig/scripts/python/repos.py +26 -18
  142. machineconfig/scripts/python/scheduler.py +70 -53
  143. machineconfig/scripts/python/snapshot.py +21 -24
  144. machineconfig/scripts/python/start_slidev.py +6 -5
  145. machineconfig/scripts/python/start_terminals.py +3 -1
  146. machineconfig/scripts/python/viewer.py +5 -4
  147. machineconfig/scripts/python/viewer_template.py +138 -140
  148. machineconfig/scripts/python/wifi_conn.py +412 -60
  149. machineconfig/scripts/python/wsl_windows_transfer.py +18 -3
  150. machineconfig/settings/linters/.pylintrc +6 -7
  151. machineconfig/settings/lvim/windows/config.lua +0 -0
  152. machineconfig/settings/shells/bash/init.sh +6 -0
  153. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +7 -6
  154. machineconfig/settings/shells/pwsh/init.ps1 +6 -6
  155. machineconfig/settings/shells/wt/settings.json +51 -266
  156. machineconfig/setup_linux/web_shortcuts/interactive.sh +5 -2
  157. machineconfig/setup_windows/wt_and_pwsh/set_pwsh_theme.py +3 -6
  158. machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +11 -9
  159. machineconfig/utils/ai/url2md.py +2 -2
  160. machineconfig/utils/cloud/onedrive/setup_oauth.py +59 -0
  161. machineconfig/utils/cloud/onedrive/transaction.py +796 -0
  162. machineconfig/utils/code.py +22 -13
  163. machineconfig/utils/installer.py +78 -35
  164. machineconfig/utils/installer_utils/installer_abc.py +7 -6
  165. machineconfig/utils/installer_utils/installer_class.py +44 -25
  166. machineconfig/utils/io_save.py +107 -0
  167. machineconfig/utils/links.py +19 -15
  168. machineconfig/utils/options.py +4 -8
  169. machineconfig/utils/path.py +91 -78
  170. machineconfig/utils/path_reduced.py +608 -0
  171. machineconfig/utils/procs.py +110 -45
  172. machineconfig/utils/scheduling.py +312 -222
  173. machineconfig/utils/utils.py +7 -7
  174. machineconfig/utils/utils2.py +42 -0
  175. machineconfig/utils/utils5.py +84 -0
  176. machineconfig/utils/ve.py +49 -87
  177. {machineconfig-1.95.dist-info → machineconfig-1.96.dist-info}/METADATA +2 -2
  178. machineconfig-1.96.dist-info/RECORD +437 -0
  179. machineconfig/cluster/session_managers.py +0 -183
  180. machineconfig/cluster/templates/f.py +0 -4
  181. machineconfig/jobs/python/__pycache__/check_installations.cpython-311.pyc +0 -0
  182. machineconfig/jobs/python/__pycache__/checkout_version.cpython-311.pyc +0 -0
  183. machineconfig/jobs/python/__pycache__/python_ve_symlink.cpython-311.pyc +0 -0
  184. machineconfig/jobs/python/checkout_version.py +0 -123
  185. machineconfig/jobs/python/vscode/__pycache__/api.cpython-311.pyc +0 -0
  186. machineconfig/jobs/python/vscode/__pycache__/link_ve.cpython-311.pyc +0 -0
  187. machineconfig/jobs/python_custom_installers/__pycache__/hx.cpython-311.pyc +0 -0
  188. machineconfig/jobs/python_windows_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  189. machineconfig/scripts/python/.mypy_cache/.gitignore +0 -2
  190. machineconfig/scripts/python/.mypy_cache/3.11/@plugins_snapshot.json +0 -1
  191. machineconfig/scripts/python/.mypy_cache/3.11/__future__.data.json +0 -1
  192. machineconfig/scripts/python/.mypy_cache/3.11/__future__.meta.json +0 -1
  193. machineconfig/scripts/python/.mypy_cache/3.11/_ast.data.json +0 -1
  194. machineconfig/scripts/python/.mypy_cache/3.11/_ast.meta.json +0 -1
  195. machineconfig/scripts/python/.mypy_cache/3.11/_bz2.data.json +0 -1
  196. machineconfig/scripts/python/.mypy_cache/3.11/_bz2.meta.json +0 -1
  197. machineconfig/scripts/python/.mypy_cache/3.11/_codecs.data.json +0 -1
  198. machineconfig/scripts/python/.mypy_cache/3.11/_codecs.meta.json +0 -1
  199. machineconfig/scripts/python/.mypy_cache/3.11/_collections_abc.data.json +0 -1
  200. machineconfig/scripts/python/.mypy_cache/3.11/_collections_abc.meta.json +0 -1
  201. machineconfig/scripts/python/.mypy_cache/3.11/_compression.data.json +0 -1
  202. machineconfig/scripts/python/.mypy_cache/3.11/_compression.meta.json +0 -1
  203. machineconfig/scripts/python/.mypy_cache/3.11/_decimal.data.json +0 -1
  204. machineconfig/scripts/python/.mypy_cache/3.11/_decimal.meta.json +0 -1
  205. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib.data.json +0 -1
  206. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib.meta.json +0 -1
  207. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib_external.data.json +0 -1
  208. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib_external.meta.json +0 -1
  209. machineconfig/scripts/python/.mypy_cache/3.11/_io.data.json +0 -1
  210. machineconfig/scripts/python/.mypy_cache/3.11/_io.meta.json +0 -1
  211. machineconfig/scripts/python/.mypy_cache/3.11/_locale.data.json +0 -1
  212. machineconfig/scripts/python/.mypy_cache/3.11/_locale.meta.json +0 -1
  213. machineconfig/scripts/python/.mypy_cache/3.11/_stat.data.json +0 -1
  214. machineconfig/scripts/python/.mypy_cache/3.11/_stat.meta.json +0 -1
  215. machineconfig/scripts/python/.mypy_cache/3.11/_struct.data.json +0 -1
  216. machineconfig/scripts/python/.mypy_cache/3.11/_struct.meta.json +0 -1
  217. machineconfig/scripts/python/.mypy_cache/3.11/_thread.data.json +0 -1
  218. machineconfig/scripts/python/.mypy_cache/3.11/_thread.meta.json +0 -1
  219. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/__init__.data.json +0 -1
  220. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/__init__.meta.json +0 -1
  221. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/importlib.data.json +0 -1
  222. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/importlib.meta.json +0 -1
  223. machineconfig/scripts/python/.mypy_cache/3.11/_warnings.data.json +0 -1
  224. machineconfig/scripts/python/.mypy_cache/3.11/_warnings.meta.json +0 -1
  225. machineconfig/scripts/python/.mypy_cache/3.11/_weakref.data.json +0 -1
  226. machineconfig/scripts/python/.mypy_cache/3.11/_weakref.meta.json +0 -1
  227. machineconfig/scripts/python/.mypy_cache/3.11/_weakrefset.data.json +0 -1
  228. machineconfig/scripts/python/.mypy_cache/3.11/_weakrefset.meta.json +0 -1
  229. machineconfig/scripts/python/.mypy_cache/3.11/abc.data.json +0 -1
  230. machineconfig/scripts/python/.mypy_cache/3.11/abc.meta.json +0 -1
  231. machineconfig/scripts/python/.mypy_cache/3.11/argparse.data.json +0 -1
  232. machineconfig/scripts/python/.mypy_cache/3.11/argparse.meta.json +0 -1
  233. machineconfig/scripts/python/.mypy_cache/3.11/ast.data.json +0 -1
  234. machineconfig/scripts/python/.mypy_cache/3.11/ast.meta.json +0 -1
  235. machineconfig/scripts/python/.mypy_cache/3.11/binascii.data.json +0 -1
  236. machineconfig/scripts/python/.mypy_cache/3.11/binascii.meta.json +0 -1
  237. machineconfig/scripts/python/.mypy_cache/3.11/builtins.data.json +0 -1
  238. machineconfig/scripts/python/.mypy_cache/3.11/builtins.meta.json +0 -1
  239. machineconfig/scripts/python/.mypy_cache/3.11/bz2.data.json +0 -1
  240. machineconfig/scripts/python/.mypy_cache/3.11/bz2.meta.json +0 -1
  241. machineconfig/scripts/python/.mypy_cache/3.11/calendar.data.json +0 -1
  242. machineconfig/scripts/python/.mypy_cache/3.11/calendar.meta.json +0 -1
  243. machineconfig/scripts/python/.mypy_cache/3.11/codecs.data.json +0 -1
  244. machineconfig/scripts/python/.mypy_cache/3.11/codecs.meta.json +0 -1
  245. machineconfig/scripts/python/.mypy_cache/3.11/collections/__init__.data.json +0 -1
  246. machineconfig/scripts/python/.mypy_cache/3.11/collections/__init__.meta.json +0 -1
  247. machineconfig/scripts/python/.mypy_cache/3.11/collections/abc.data.json +0 -1
  248. machineconfig/scripts/python/.mypy_cache/3.11/collections/abc.meta.json +0 -1
  249. machineconfig/scripts/python/.mypy_cache/3.11/configparser.data.json +0 -1
  250. machineconfig/scripts/python/.mypy_cache/3.11/configparser.meta.json +0 -1
  251. machineconfig/scripts/python/.mypy_cache/3.11/contextlib.data.json +0 -1
  252. machineconfig/scripts/python/.mypy_cache/3.11/contextlib.meta.json +0 -1
  253. machineconfig/scripts/python/.mypy_cache/3.11/dataclasses.data.json +0 -1
  254. machineconfig/scripts/python/.mypy_cache/3.11/dataclasses.meta.json +0 -1
  255. machineconfig/scripts/python/.mypy_cache/3.11/datetime.data.json +0 -1
  256. machineconfig/scripts/python/.mypy_cache/3.11/datetime.meta.json +0 -1
  257. machineconfig/scripts/python/.mypy_cache/3.11/decimal.data.json +0 -1
  258. machineconfig/scripts/python/.mypy_cache/3.11/decimal.meta.json +0 -1
  259. machineconfig/scripts/python/.mypy_cache/3.11/dis.data.json +0 -1
  260. machineconfig/scripts/python/.mypy_cache/3.11/dis.meta.json +0 -1
  261. machineconfig/scripts/python/.mypy_cache/3.11/email/__init__.data.json +0 -1
  262. machineconfig/scripts/python/.mypy_cache/3.11/email/__init__.meta.json +0 -1
  263. machineconfig/scripts/python/.mypy_cache/3.11/email/_policybase.data.json +0 -1
  264. machineconfig/scripts/python/.mypy_cache/3.11/email/_policybase.meta.json +0 -1
  265. machineconfig/scripts/python/.mypy_cache/3.11/email/charset.data.json +0 -1
  266. machineconfig/scripts/python/.mypy_cache/3.11/email/charset.meta.json +0 -1
  267. machineconfig/scripts/python/.mypy_cache/3.11/email/contentmanager.data.json +0 -1
  268. machineconfig/scripts/python/.mypy_cache/3.11/email/contentmanager.meta.json +0 -1
  269. machineconfig/scripts/python/.mypy_cache/3.11/email/errors.data.json +0 -1
  270. machineconfig/scripts/python/.mypy_cache/3.11/email/errors.meta.json +0 -1
  271. machineconfig/scripts/python/.mypy_cache/3.11/email/header.data.json +0 -1
  272. machineconfig/scripts/python/.mypy_cache/3.11/email/header.meta.json +0 -1
  273. machineconfig/scripts/python/.mypy_cache/3.11/email/message.data.json +0 -1
  274. machineconfig/scripts/python/.mypy_cache/3.11/email/message.meta.json +0 -1
  275. machineconfig/scripts/python/.mypy_cache/3.11/email/policy.data.json +0 -1
  276. machineconfig/scripts/python/.mypy_cache/3.11/email/policy.meta.json +0 -1
  277. machineconfig/scripts/python/.mypy_cache/3.11/enum.data.json +0 -1
  278. machineconfig/scripts/python/.mypy_cache/3.11/enum.meta.json +0 -1
  279. machineconfig/scripts/python/.mypy_cache/3.11/fnmatch.data.json +0 -1
  280. machineconfig/scripts/python/.mypy_cache/3.11/fnmatch.meta.json +0 -1
  281. machineconfig/scripts/python/.mypy_cache/3.11/functools.data.json +0 -1
  282. machineconfig/scripts/python/.mypy_cache/3.11/functools.meta.json +0 -1
  283. machineconfig/scripts/python/.mypy_cache/3.11/gc.data.json +0 -1
  284. machineconfig/scripts/python/.mypy_cache/3.11/gc.meta.json +0 -1
  285. machineconfig/scripts/python/.mypy_cache/3.11/genericpath.data.json +0 -1
  286. machineconfig/scripts/python/.mypy_cache/3.11/genericpath.meta.json +0 -1
  287. machineconfig/scripts/python/.mypy_cache/3.11/getpass.data.json +0 -1
  288. machineconfig/scripts/python/.mypy_cache/3.11/getpass.meta.json +0 -1
  289. machineconfig/scripts/python/.mypy_cache/3.11/git/__init__.data.json +0 -1
  290. machineconfig/scripts/python/.mypy_cache/3.11/git/__init__.meta.json +0 -1
  291. machineconfig/scripts/python/.mypy_cache/3.11/git/cmd.data.json +0 -1
  292. machineconfig/scripts/python/.mypy_cache/3.11/git/cmd.meta.json +0 -1
  293. machineconfig/scripts/python/.mypy_cache/3.11/git/compat.data.json +0 -1
  294. machineconfig/scripts/python/.mypy_cache/3.11/git/compat.meta.json +0 -1
  295. machineconfig/scripts/python/.mypy_cache/3.11/git/config.data.json +0 -1
  296. machineconfig/scripts/python/.mypy_cache/3.11/git/config.meta.json +0 -1
  297. machineconfig/scripts/python/.mypy_cache/3.11/git/db.data.json +0 -1
  298. machineconfig/scripts/python/.mypy_cache/3.11/git/db.meta.json +0 -1
  299. machineconfig/scripts/python/.mypy_cache/3.11/git/diff.data.json +0 -1
  300. machineconfig/scripts/python/.mypy_cache/3.11/git/diff.meta.json +0 -1
  301. machineconfig/scripts/python/.mypy_cache/3.11/git/exc.data.json +0 -1
  302. machineconfig/scripts/python/.mypy_cache/3.11/git/exc.meta.json +0 -1
  303. machineconfig/scripts/python/.mypy_cache/3.11/git/index/__init__.data.json +0 -1
  304. machineconfig/scripts/python/.mypy_cache/3.11/git/index/__init__.meta.json +0 -1
  305. machineconfig/scripts/python/.mypy_cache/3.11/git/index/base.data.json +0 -1
  306. machineconfig/scripts/python/.mypy_cache/3.11/git/index/base.meta.json +0 -1
  307. machineconfig/scripts/python/.mypy_cache/3.11/git/index/fun.data.json +0 -1
  308. machineconfig/scripts/python/.mypy_cache/3.11/git/index/fun.meta.json +0 -1
  309. machineconfig/scripts/python/.mypy_cache/3.11/git/index/typ.data.json +0 -1
  310. machineconfig/scripts/python/.mypy_cache/3.11/git/index/typ.meta.json +0 -1
  311. machineconfig/scripts/python/.mypy_cache/3.11/git/index/util.data.json +0 -1
  312. machineconfig/scripts/python/.mypy_cache/3.11/git/index/util.meta.json +0 -1
  313. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/__init__.data.json +0 -1
  314. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/__init__.meta.json +0 -1
  315. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/base.data.json +0 -1
  316. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/base.meta.json +0 -1
  317. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/blob.data.json +0 -1
  318. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/blob.meta.json +0 -1
  319. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/commit.data.json +0 -1
  320. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/commit.meta.json +0 -1
  321. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/fun.data.json +0 -1
  322. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/fun.meta.json +0 -1
  323. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/__init__.data.json +0 -1
  324. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/__init__.meta.json +0 -1
  325. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/base.data.json +0 -1
  326. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/base.meta.json +0 -1
  327. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/root.data.json +0 -1
  328. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/root.meta.json +0 -1
  329. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/util.data.json +0 -1
  330. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/util.meta.json +0 -1
  331. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tag.data.json +0 -1
  332. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tag.meta.json +0 -1
  333. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tree.data.json +0 -1
  334. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tree.meta.json +0 -1
  335. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/util.data.json +0 -1
  336. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/util.meta.json +0 -1
  337. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/__init__.data.json +0 -1
  338. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/__init__.meta.json +0 -1
  339. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/head.data.json +0 -1
  340. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/head.meta.json +0 -1
  341. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/log.data.json +0 -1
  342. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/log.meta.json +0 -1
  343. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/reference.data.json +0 -1
  344. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/reference.meta.json +0 -1
  345. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/remote.data.json +0 -1
  346. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/remote.meta.json +0 -1
  347. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/symbolic.data.json +0 -1
  348. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/symbolic.meta.json +0 -1
  349. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/tag.data.json +0 -1
  350. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/tag.meta.json +0 -1
  351. machineconfig/scripts/python/.mypy_cache/3.11/git/remote.data.json +0 -1
  352. machineconfig/scripts/python/.mypy_cache/3.11/git/remote.meta.json +0 -1
  353. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/__init__.data.json +0 -1
  354. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/__init__.meta.json +0 -1
  355. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/base.data.json +0 -1
  356. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/base.meta.json +0 -1
  357. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/fun.data.json +0 -1
  358. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/fun.meta.json +0 -1
  359. machineconfig/scripts/python/.mypy_cache/3.11/git/types.data.json +0 -1
  360. machineconfig/scripts/python/.mypy_cache/3.11/git/types.meta.json +0 -1
  361. machineconfig/scripts/python/.mypy_cache/3.11/git/util.data.json +0 -1
  362. machineconfig/scripts/python/.mypy_cache/3.11/git/util.meta.json +0 -1
  363. machineconfig/scripts/python/.mypy_cache/3.11/glob.data.json +0 -1
  364. machineconfig/scripts/python/.mypy_cache/3.11/glob.meta.json +0 -1
  365. machineconfig/scripts/python/.mypy_cache/3.11/gzip.data.json +0 -1
  366. machineconfig/scripts/python/.mypy_cache/3.11/gzip.meta.json +0 -1
  367. machineconfig/scripts/python/.mypy_cache/3.11/importlib/__init__.data.json +0 -1
  368. machineconfig/scripts/python/.mypy_cache/3.11/importlib/__init__.meta.json +0 -1
  369. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_abc.data.json +0 -1
  370. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_abc.meta.json +0 -1
  371. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap.data.json +0 -1
  372. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap.meta.json +0 -1
  373. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap_external.data.json +0 -1
  374. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap_external.meta.json +0 -1
  375. machineconfig/scripts/python/.mypy_cache/3.11/importlib/abc.data.json +0 -1
  376. machineconfig/scripts/python/.mypy_cache/3.11/importlib/abc.meta.json +0 -1
  377. machineconfig/scripts/python/.mypy_cache/3.11/importlib/machinery.data.json +0 -1
  378. machineconfig/scripts/python/.mypy_cache/3.11/importlib/machinery.meta.json +0 -1
  379. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/__init__.data.json +0 -1
  380. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/__init__.meta.json +0 -1
  381. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/_meta.data.json +0 -1
  382. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/_meta.meta.json +0 -1
  383. machineconfig/scripts/python/.mypy_cache/3.11/importlib/readers.data.json +0 -1
  384. machineconfig/scripts/python/.mypy_cache/3.11/importlib/readers.meta.json +0 -1
  385. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/__init__.data.json +0 -1
  386. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/__init__.meta.json +0 -1
  387. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/_common.data.json +0 -1
  388. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/_common.meta.json +0 -1
  389. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/abc.data.json +0 -1
  390. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/abc.meta.json +0 -1
  391. machineconfig/scripts/python/.mypy_cache/3.11/inspect.data.json +0 -1
  392. machineconfig/scripts/python/.mypy_cache/3.11/inspect.meta.json +0 -1
  393. machineconfig/scripts/python/.mypy_cache/3.11/io.data.json +0 -1
  394. machineconfig/scripts/python/.mypy_cache/3.11/io.meta.json +0 -1
  395. machineconfig/scripts/python/.mypy_cache/3.11/itertools.data.json +0 -1
  396. machineconfig/scripts/python/.mypy_cache/3.11/itertools.meta.json +0 -1
  397. machineconfig/scripts/python/.mypy_cache/3.11/locale.data.json +0 -1
  398. machineconfig/scripts/python/.mypy_cache/3.11/locale.meta.json +0 -1
  399. machineconfig/scripts/python/.mypy_cache/3.11/logging/__init__.data.json +0 -1
  400. machineconfig/scripts/python/.mypy_cache/3.11/logging/__init__.meta.json +0 -1
  401. machineconfig/scripts/python/.mypy_cache/3.11/mimetypes.data.json +0 -1
  402. machineconfig/scripts/python/.mypy_cache/3.11/mimetypes.meta.json +0 -1
  403. machineconfig/scripts/python/.mypy_cache/3.11/mmap.data.json +0 -1
  404. machineconfig/scripts/python/.mypy_cache/3.11/mmap.meta.json +0 -1
  405. machineconfig/scripts/python/.mypy_cache/3.11/numbers.data.json +0 -1
  406. machineconfig/scripts/python/.mypy_cache/3.11/numbers.meta.json +0 -1
  407. machineconfig/scripts/python/.mypy_cache/3.11/opcode.data.json +0 -1
  408. machineconfig/scripts/python/.mypy_cache/3.11/opcode.meta.json +0 -1
  409. machineconfig/scripts/python/.mypy_cache/3.11/os/__init__.data.json +0 -1
  410. machineconfig/scripts/python/.mypy_cache/3.11/os/__init__.meta.json +0 -1
  411. machineconfig/scripts/python/.mypy_cache/3.11/os/path.data.json +0 -1
  412. machineconfig/scripts/python/.mypy_cache/3.11/os/path.meta.json +0 -1
  413. machineconfig/scripts/python/.mypy_cache/3.11/pathlib.data.json +0 -1
  414. machineconfig/scripts/python/.mypy_cache/3.11/pathlib.meta.json +0 -1
  415. machineconfig/scripts/python/.mypy_cache/3.11/platform.data.json +0 -1
  416. machineconfig/scripts/python/.mypy_cache/3.11/platform.meta.json +0 -1
  417. machineconfig/scripts/python/.mypy_cache/3.11/posixpath.data.json +0 -1
  418. machineconfig/scripts/python/.mypy_cache/3.11/posixpath.meta.json +0 -1
  419. machineconfig/scripts/python/.mypy_cache/3.11/re.data.json +0 -1
  420. machineconfig/scripts/python/.mypy_cache/3.11/re.meta.json +0 -1
  421. machineconfig/scripts/python/.mypy_cache/3.11/resource.data.json +0 -1
  422. machineconfig/scripts/python/.mypy_cache/3.11/resource.meta.json +0 -1
  423. machineconfig/scripts/python/.mypy_cache/3.11/shlex.data.json +0 -1
  424. machineconfig/scripts/python/.mypy_cache/3.11/shlex.meta.json +0 -1
  425. machineconfig/scripts/python/.mypy_cache/3.11/shutil.data.json +0 -1
  426. machineconfig/scripts/python/.mypy_cache/3.11/shutil.meta.json +0 -1
  427. machineconfig/scripts/python/.mypy_cache/3.11/signal.data.json +0 -1
  428. machineconfig/scripts/python/.mypy_cache/3.11/signal.meta.json +0 -1
  429. machineconfig/scripts/python/.mypy_cache/3.11/src/__init__.data.json +0 -1
  430. machineconfig/scripts/python/.mypy_cache/3.11/src/__init__.meta.json +0 -1
  431. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/__init__.data.json +0 -1
  432. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/__init__.meta.json +0 -1
  433. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/__init__.data.json +0 -1
  434. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/__init__.meta.json +0 -1
  435. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/python/__init__.data.json +0 -1
  436. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/python/__init__.meta.json +0 -1
  437. machineconfig/scripts/python/.mypy_cache/3.11/sre_compile.data.json +0 -1
  438. machineconfig/scripts/python/.mypy_cache/3.11/sre_compile.meta.json +0 -1
  439. machineconfig/scripts/python/.mypy_cache/3.11/sre_constants.data.json +0 -1
  440. machineconfig/scripts/python/.mypy_cache/3.11/sre_constants.meta.json +0 -1
  441. machineconfig/scripts/python/.mypy_cache/3.11/sre_parse.data.json +0 -1
  442. machineconfig/scripts/python/.mypy_cache/3.11/sre_parse.meta.json +0 -1
  443. machineconfig/scripts/python/.mypy_cache/3.11/stat.data.json +0 -1
  444. machineconfig/scripts/python/.mypy_cache/3.11/stat.meta.json +0 -1
  445. machineconfig/scripts/python/.mypy_cache/3.11/string.data.json +0 -1
  446. machineconfig/scripts/python/.mypy_cache/3.11/string.meta.json +0 -1
  447. machineconfig/scripts/python/.mypy_cache/3.11/struct.data.json +0 -1
  448. machineconfig/scripts/python/.mypy_cache/3.11/struct.meta.json +0 -1
  449. machineconfig/scripts/python/.mypy_cache/3.11/subprocess.data.json +0 -1
  450. machineconfig/scripts/python/.mypy_cache/3.11/subprocess.meta.json +0 -1
  451. machineconfig/scripts/python/.mypy_cache/3.11/sys/__init__.data.json +0 -1
  452. machineconfig/scripts/python/.mypy_cache/3.11/sys/__init__.meta.json +0 -1
  453. machineconfig/scripts/python/.mypy_cache/3.11/tarfile.data.json +0 -1
  454. machineconfig/scripts/python/.mypy_cache/3.11/tarfile.meta.json +0 -1
  455. machineconfig/scripts/python/.mypy_cache/3.11/tempfile.data.json +0 -1
  456. machineconfig/scripts/python/.mypy_cache/3.11/tempfile.meta.json +0 -1
  457. machineconfig/scripts/python/.mypy_cache/3.11/textwrap.data.json +0 -1
  458. machineconfig/scripts/python/.mypy_cache/3.11/textwrap.meta.json +0 -1
  459. machineconfig/scripts/python/.mypy_cache/3.11/threading.data.json +0 -1
  460. machineconfig/scripts/python/.mypy_cache/3.11/threading.meta.json +0 -1
  461. machineconfig/scripts/python/.mypy_cache/3.11/time.data.json +0 -1
  462. machineconfig/scripts/python/.mypy_cache/3.11/time.meta.json +0 -1
  463. machineconfig/scripts/python/.mypy_cache/3.11/types.data.json +0 -1
  464. machineconfig/scripts/python/.mypy_cache/3.11/types.meta.json +0 -1
  465. machineconfig/scripts/python/.mypy_cache/3.11/typing.data.json +0 -1
  466. machineconfig/scripts/python/.mypy_cache/3.11/typing.meta.json +0 -1
  467. machineconfig/scripts/python/.mypy_cache/3.11/typing_extensions.data.json +0 -1
  468. machineconfig/scripts/python/.mypy_cache/3.11/typing_extensions.meta.json +0 -1
  469. machineconfig/scripts/python/.mypy_cache/3.11/urllib/__init__.data.json +0 -1
  470. machineconfig/scripts/python/.mypy_cache/3.11/urllib/__init__.meta.json +0 -1
  471. machineconfig/scripts/python/.mypy_cache/3.11/urllib/parse.data.json +0 -1
  472. machineconfig/scripts/python/.mypy_cache/3.11/urllib/parse.meta.json +0 -1
  473. machineconfig/scripts/python/.mypy_cache/3.11/uuid.data.json +0 -1
  474. machineconfig/scripts/python/.mypy_cache/3.11/uuid.meta.json +0 -1
  475. machineconfig/scripts/python/.mypy_cache/3.11/warnings.data.json +0 -1
  476. machineconfig/scripts/python/.mypy_cache/3.11/warnings.meta.json +0 -1
  477. machineconfig/scripts/python/.mypy_cache/3.11/weakref.data.json +0 -1
  478. machineconfig/scripts/python/.mypy_cache/3.11/weakref.meta.json +0 -1
  479. machineconfig/scripts/python/.mypy_cache/3.11/zipfile/__init__.data.json +0 -1
  480. machineconfig/scripts/python/.mypy_cache/3.11/zipfile/__init__.meta.json +0 -1
  481. machineconfig/scripts/python/.mypy_cache/3.11/zlib.data.json +0 -1
  482. machineconfig/scripts/python/.mypy_cache/3.11/zlib.meta.json +0 -1
  483. machineconfig/scripts/python/.mypy_cache/CACHEDIR.TAG +0 -3
  484. machineconfig/scripts/python/__pycache__/cloud_repo_sync.cpython-311.pyc +0 -0
  485. machineconfig/scripts/python/__pycache__/gh_models.cpython-311.pyc +0 -0
  486. machineconfig/scripts/python/__pycache__/url2md.cpython-311.pyc +0 -0
  487. machineconfig/scripts/python/__pycache__/viewer.cpython-311.pyc +0 -0
  488. machineconfig/scripts/python/__pycache__/vscode_api.cpython-311.pyc +0 -0
  489. machineconfig/settings/__pycache__/__init__.cpython-311.pyc +0 -0
  490. machineconfig/settings/linters/.ruff_cache/.gitignore +0 -2
  491. machineconfig/settings/linters/.ruff_cache/CACHEDIR.TAG +0 -1
  492. machineconfig/settings/shells/ipy/profiles/default/__pycache__/__init__.cpython-311.pyc +0 -0
  493. machineconfig/settings/shells/ipy/profiles/default/startup/__pycache__/__init__.cpython-311.pyc +0 -0
  494. machineconfig/settings/shells/ipy/profiles/default/startup/__pycache__/playext.cpython-311.pyc +0 -0
  495. machineconfig/utils/ve_utils/ve1.py +0 -111
  496. machineconfig/utils/ve_utils/ve2.py +0 -155
  497. machineconfig-1.95.dist-info/RECORD +0 -712
  498. {machineconfig-1.95.dist-info → machineconfig-1.96.dist-info}/WHEEL +0 -0
  499. {machineconfig-1.95.dist-info → machineconfig-1.96.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,494 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Windows Terminal local layout generator and session manager.
4
+ Equivalent to zellij_local.py but for Windows Terminal.
5
+ """
6
+ import shlex
7
+ import subprocess
8
+ import random
9
+ import string
10
+ import json
11
+ from typing import Dict, List, Optional, Any
12
+ from pathlib import Path
13
+ import logging
14
+
15
+ logging.basicConfig(level=logging.INFO)
16
+ logger = logging.getLogger(__name__)
17
+ TMP_LAYOUT_DIR = Path.home().joinpath("tmp_results", "session_manager", "wt", "layout_manager")
18
+
19
+
20
+ class WTLayoutGenerator:
21
+ def __init__(self):
22
+ self.session_name: Optional[str] = None
23
+ self.tab_config: Dict[str, tuple[str, str]] = {} # Store entire tab config (cwd, command) for status checking
24
+ self.script_path: Optional[str] = None # Store the full path to the script file
25
+
26
+ @staticmethod
27
+ def _generate_random_suffix(length: int = 8) -> str:
28
+ """Generate a random string suffix for unique script file names."""
29
+ return ''.join(random.choices(string.ascii_lowercase + string.digits, k=length))
30
+
31
+ @staticmethod
32
+ def _parse_command(command: str) -> tuple[str, List[str]]:
33
+ try:
34
+ parts = shlex.split(command)
35
+ if not parts: raise ValueError("Empty command provided")
36
+ return parts[0], parts[1:] if len(parts) > 1 else []
37
+ except ValueError as e:
38
+ logger.error(f"Error parsing command '{command}': {e}")
39
+ parts = command.split()
40
+ return parts[0] if parts else "", parts[1:] if len(parts) > 1 else []
41
+
42
+ @staticmethod
43
+ def _escape_for_wt(text: str) -> str:
44
+ """Escape text for use in Windows Terminal commands."""
45
+ # Windows Terminal uses PowerShell-style escaping
46
+ text = text.replace('"', '""') # Escape quotes for PowerShell
47
+ if ' ' in text or ';' in text or '&' in text or '|' in text:
48
+ return f'"{text}"'
49
+ return text
50
+
51
+ @staticmethod
52
+ def _create_tab_command(tab_name: str, cwd: str, command: str, is_first_tab: bool = False) -> str:
53
+ """Create a Windows Terminal tab command string."""
54
+ # Convert paths to Windows format if needed
55
+ if cwd.startswith('~/'):
56
+ cwd = cwd.replace('~/', f"{Path.home()}/")
57
+ elif cwd == '~':
58
+ cwd = str(Path.home())
59
+
60
+ # Build the wt command parts
61
+ tab_parts = []
62
+
63
+ if not is_first_tab:
64
+ tab_parts.append("new-tab")
65
+
66
+ # Add starting directory
67
+ tab_parts.extend(["-d", WTLayoutGenerator._escape_for_wt(cwd)])
68
+
69
+ # Add tab title
70
+ tab_parts.extend(["--title", WTLayoutGenerator._escape_for_wt(tab_name)])
71
+
72
+ # Add the command to execute
73
+ tab_parts.append(WTLayoutGenerator._escape_for_wt(command))
74
+
75
+ return " ".join(tab_parts)
76
+
77
+ @staticmethod
78
+ def _validate_tab_config(tab_config: Dict[str, tuple[str, str]]) -> None:
79
+ """Validate tab configuration format and content."""
80
+ if not tab_config:
81
+ raise ValueError("Tab configuration cannot be empty")
82
+ for tab_name, (cwd, command) in tab_config.items():
83
+ if not tab_name.strip():
84
+ raise ValueError(f"Invalid tab name: {tab_name}")
85
+ if not command.strip():
86
+ raise ValueError(f"Invalid command for tab '{tab_name}': {command}")
87
+ if not cwd.strip():
88
+ raise ValueError(f"Invalid cwd for tab '{tab_name}': {cwd}")
89
+
90
+ def create_wt_layout(self, tab_config: Dict[str, tuple[str, str]], output_dir: Optional[str] = None, session_name: Optional[str] = None) -> str:
91
+ WTLayoutGenerator._validate_tab_config(tab_config)
92
+ logger.info(f"Creating Windows Terminal layout with {len(tab_config)} tabs")
93
+
94
+ # Store session name and entire tab config for status checking
95
+ self.session_name = session_name or "default"
96
+ self.tab_config = tab_config.copy()
97
+
98
+ # Generate Windows Terminal command
99
+ wt_command = self._generate_wt_command_string(tab_config, self.session_name)
100
+
101
+ try:
102
+ random_suffix = WTLayoutGenerator._generate_random_suffix()
103
+ if output_dir:
104
+ output_path = Path(output_dir)
105
+ output_path.mkdir(parents=True, exist_ok=True)
106
+ script_file = output_path / f"wt_layout_{random_suffix}.bat"
107
+ else:
108
+ # Use the predefined TMP_LAYOUT_DIR for temporary files
109
+ TMP_LAYOUT_DIR.mkdir(parents=True, exist_ok=True)
110
+ script_file = TMP_LAYOUT_DIR / f"wt_layout_{self.session_name}_{random_suffix}.bat"
111
+
112
+ # Create batch script
113
+ with open(script_file, 'w', encoding='utf-8') as f:
114
+ f.write("@echo off\n")
115
+ f.write(f"REM Windows Terminal layout for {self.session_name}\n")
116
+ f.write(f"{wt_command}\n")
117
+
118
+ # Also create PowerShell script for better command handling
119
+ ps1_file = script_file.with_suffix('.ps1')
120
+ with open(ps1_file, 'w', encoding='utf-8') as f:
121
+ f.write(f"# Windows Terminal layout for {self.session_name}\n")
122
+ f.write(f"# Generated with random suffix: {random_suffix}\n")
123
+ f.write(f"{wt_command}\n")
124
+
125
+ self.script_path = str(script_file.absolute())
126
+ logger.info(f"Windows Terminal script file created: {self.script_path}")
127
+ return self.script_path
128
+ except OSError as e:
129
+ logger.error(f"Failed to create script file: {e}")
130
+ raise
131
+
132
+ def _generate_wt_command_string(self, tab_config: Dict[str, tuple[str, str]], window_name: str) -> str:
133
+ """Generate complete Windows Terminal command string."""
134
+ # Start building the wt command
135
+ wt_parts = ["wt"]
136
+
137
+ # Add window name
138
+ wt_parts.extend(["-w", WTLayoutGenerator._escape_for_wt(window_name)])
139
+
140
+ # Add tabs
141
+ tab_commands = []
142
+ for i, (tab_name, (cwd, command)) in enumerate(tab_config.items()):
143
+ is_first = i == 0
144
+ tab_cmd = self._create_tab_command(tab_name, cwd, command, is_first)
145
+ tab_commands.append(tab_cmd)
146
+
147
+ # Join all parts with semicolons (Windows Terminal command separator)
148
+ if tab_commands:
149
+ if len(tab_commands) == 1:
150
+ # Single tab - just add to the main command
151
+ wt_parts.extend(tab_commands[0].split())
152
+ else:
153
+ # Multiple tabs - join with semicolons
154
+ wt_parts.append(tab_commands[0]) # First tab
155
+ for tab_cmd in tab_commands[1:]:
156
+ wt_parts.extend([";", tab_cmd])
157
+
158
+ return " ".join(wt_parts)
159
+
160
+ def get_wt_layout_preview(self, tab_config: Dict[str, tuple[str, str]]) -> str:
161
+ """Generate preview of the Windows Terminal command that would be created."""
162
+ WTLayoutGenerator._validate_tab_config(tab_config)
163
+ return self._generate_wt_command_string(tab_config, "preview")
164
+
165
+ def check_all_commands_status(self) -> Dict[str, Dict[str, Any]]:
166
+ if not self.tab_config:
167
+ logger.warning("No tab config tracked. Make sure to create a layout first.")
168
+ return {}
169
+
170
+ status_report = {}
171
+ for tab_name in self.tab_config:
172
+ status_report[tab_name] = WTLayoutGenerator.check_command_status(tab_name, self.tab_config)
173
+
174
+ return status_report
175
+
176
+ @staticmethod
177
+ def check_wt_session_status(session_name: str) -> Dict[str, Any]:
178
+ try:
179
+ # Check for Windows Terminal processes
180
+ wt_check_cmd = [
181
+ "powershell", "-Command",
182
+ "Get-Process -Name 'WindowsTerminal' -ErrorAction SilentlyContinue | "
183
+ "Select-Object Id, ProcessName, StartTime, MainWindowTitle | "
184
+ "ConvertTo-Json -Depth 2"
185
+ ]
186
+
187
+ result = subprocess.run(wt_check_cmd, capture_output=True, text=True, timeout=10)
188
+
189
+ if result.returncode == 0:
190
+ output = result.stdout.strip()
191
+ if output and output != "":
192
+ try:
193
+ import json
194
+ processes = json.loads(output)
195
+ if not isinstance(processes, list):
196
+ processes = [processes]
197
+
198
+ # Look for windows that might belong to our session
199
+ session_windows = []
200
+ for proc in processes:
201
+ window_title = proc.get("MainWindowTitle", "")
202
+ if session_name in window_title or not window_title:
203
+ session_windows.append(proc)
204
+
205
+ return {
206
+ "wt_running": True,
207
+ "session_exists": len(session_windows) > 0,
208
+ "session_name": session_name,
209
+ "all_windows": processes,
210
+ "session_windows": session_windows
211
+ }
212
+ except Exception as e:
213
+ return {
214
+ "wt_running": True,
215
+ "session_exists": False,
216
+ "error": f"Failed to parse process info: {e}",
217
+ "session_name": session_name
218
+ }
219
+ else:
220
+ return {
221
+ "wt_running": False,
222
+ "session_exists": False,
223
+ "session_name": session_name,
224
+ "all_windows": []
225
+ }
226
+ else:
227
+ return {
228
+ "wt_running": False,
229
+ "error": result.stderr,
230
+ "session_name": session_name
231
+ }
232
+
233
+ except subprocess.TimeoutExpired:
234
+ return {
235
+ "wt_running": False,
236
+ "error": "Timeout while checking Windows Terminal processes",
237
+ "session_name": session_name
238
+ }
239
+ except FileNotFoundError:
240
+ return {
241
+ "wt_running": False,
242
+ "error": "PowerShell not found in PATH",
243
+ "session_name": session_name
244
+ }
245
+ except Exception as e:
246
+ return {
247
+ "wt_running": False,
248
+ "error": str(e),
249
+ "session_name": session_name
250
+ }
251
+
252
+ @staticmethod
253
+ def check_command_status(tab_name: str, tab_config: Dict[str, tuple[str, str]]) -> Dict[str, Any]:
254
+ """Check if a command is running by looking for processes."""
255
+ if tab_name not in tab_config:
256
+ return {
257
+ "status": "unknown",
258
+ "error": f"Tab '{tab_name}' not found in tracked configuration",
259
+ "running": False,
260
+ "pid": None,
261
+ "command": None
262
+ }
263
+
264
+ _, command = tab_config[tab_name]
265
+
266
+ try:
267
+ # Create PowerShell script to check for processes
268
+ cmd_parts = [part for part in command.split() if len(part) > 2]
269
+ primary_cmd = cmd_parts[0] if cmd_parts else ''
270
+
271
+ ps_script = f"""
272
+ $targetCommand = '{command.replace("'", "''")}'
273
+ $cmdParts = @({', '.join([f"'{part}'" for part in cmd_parts])})
274
+ $primaryCmd = '{primary_cmd}'
275
+ $currentPid = $PID
276
+ $matchingProcesses = @()
277
+
278
+ Get-Process | ForEach-Object {{
279
+ try {{
280
+ if ($_.Id -eq $currentPid) {{ return }}
281
+
282
+ $cmdline = ""
283
+ try {{
284
+ $cmdline = (Get-WmiObject Win32_Process -Filter "ProcessId = $($_.Id)").CommandLine
285
+ }} catch {{
286
+ $cmdline = $_.ProcessName
287
+ }}
288
+
289
+ if ($cmdline -and $cmdline -ne "") {{
290
+ if ($cmdline -like "*PowerShell*" -and $cmdline -like "*Get-Process*") {{ return }}
291
+
292
+ $matchesPrimary = $cmdline -like "*$primaryCmd*" -and $primaryCmd -ne "powershell"
293
+ $matchCount = 0
294
+ foreach ($part in $cmdParts[1..($cmdParts.Length-1)]) {{
295
+ if ($cmdline -like "*$part*") {{ $matchCount++ }}
296
+ }}
297
+
298
+ if ($matchesPrimary -and $matchCount -ge 1) {{
299
+ $procInfo = @{{
300
+ "pid" = $_.Id
301
+ "name" = $_.ProcessName
302
+ "cmdline" = $cmdline
303
+ "status" = $_.Status
304
+ "start_time" = $_.StartTime
305
+ }} | ConvertTo-Json -Compress
306
+ Write-Output $procInfo
307
+ }}
308
+ }}
309
+ }} catch {{
310
+ # Ignore processes we can't access
311
+ }}
312
+ }}
313
+ """
314
+
315
+ result = subprocess.run(
316
+ ["powershell", "-Command", ps_script],
317
+ capture_output=True,
318
+ text=True,
319
+ timeout=15
320
+ )
321
+
322
+ if result.returncode == 0:
323
+ output_lines = [line.strip() for line in result.stdout.strip().split('\n') if line.strip()]
324
+ matching_processes = []
325
+
326
+ for line in output_lines:
327
+ if line.startswith('{') and line.endswith('}'):
328
+ try:
329
+ proc_info = json.loads(line)
330
+ matching_processes.append(proc_info)
331
+ except json.JSONDecodeError:
332
+ continue
333
+
334
+ if matching_processes:
335
+ return {
336
+ "status": "running",
337
+ "running": True,
338
+ "processes": matching_processes,
339
+ "command": command,
340
+ "tab_name": tab_name
341
+ }
342
+ else:
343
+ return {
344
+ "status": "not_running",
345
+ "running": False,
346
+ "processes": [],
347
+ "command": command,
348
+ "tab_name": tab_name
349
+ }
350
+ else:
351
+ return {
352
+ "status": "error",
353
+ "error": f"Command failed: {result.stderr}",
354
+ "running": False,
355
+ "command": command,
356
+ "tab_name": tab_name
357
+ }
358
+
359
+ except Exception as e:
360
+ logger.error(f"Error checking command status for tab '{tab_name}': {e}")
361
+ return {
362
+ "status": "error",
363
+ "error": str(e),
364
+ "running": False,
365
+ "command": command,
366
+ "tab_name": tab_name
367
+ }
368
+
369
+ def get_status_report(self) -> Dict[str, Any]:
370
+ """Get status report for this layout including Windows Terminal and commands."""
371
+ wt_status = WTLayoutGenerator.check_wt_session_status(self.session_name or "default")
372
+ commands_status = self.check_all_commands_status()
373
+
374
+ running_count = sum(1 for status in commands_status.values() if status.get("running", False))
375
+ total_count = len(commands_status)
376
+
377
+ return {
378
+ "wt_session": wt_status,
379
+ "commands": commands_status,
380
+ "summary": {
381
+ "total_commands": total_count,
382
+ "running_commands": running_count,
383
+ "stopped_commands": total_count - running_count,
384
+ "session_healthy": wt_status.get("session_exists", False)
385
+ }
386
+ }
387
+
388
+ def print_status_report(self) -> None:
389
+ """Print a comprehensive status report for this Windows Terminal layout."""
390
+ status = self.get_status_report()
391
+ wt_session = status["wt_session"]
392
+ commands = status["commands"]
393
+ summary = status["summary"]
394
+
395
+ print("=" * 80)
396
+ print("🖥️ WINDOWS TERMINAL LAYOUT STATUS REPORT")
397
+ print("=" * 80)
398
+
399
+ # Windows Terminal session status
400
+ print(f"🪟 Session: {self.session_name}")
401
+ if wt_session.get("wt_running", False):
402
+ if wt_session.get("session_exists", False):
403
+ session_windows = wt_session.get("session_windows", [])
404
+ all_windows = wt_session.get("all_windows", [])
405
+ print("✅ Windows Terminal is running")
406
+ print(f" Session windows: {len(session_windows)}")
407
+ print(f" Total WT windows: {len(all_windows)}")
408
+ else:
409
+ print("⚠️ Windows Terminal is running but no session windows found")
410
+ else:
411
+ error_msg = wt_session.get("error", "Unknown error")
412
+ print(f"❌ Windows Terminal session issue: {error_msg}")
413
+
414
+ print()
415
+
416
+ # Commands in this layout
417
+ print(f"📋 COMMANDS ({summary['running_commands']}/{summary['total_commands']} running):")
418
+ for tab_name, cmd_status in commands.items():
419
+ status_icon = "✅" if cmd_status.get("running", False) else "❌"
420
+ cmd_text = cmd_status.get("command", "Unknown")[:50]
421
+ if len(cmd_status.get("command", "")) > 50:
422
+ cmd_text += "..."
423
+
424
+ print(f" {status_icon} {tab_name}: {cmd_text}")
425
+
426
+ if cmd_status.get("processes"):
427
+ for proc in cmd_status["processes"][:2]: # Show first 2 processes
428
+ pid = proc.get("pid", "Unknown")
429
+ name = proc.get("name", "Unknown")
430
+ print(f" └─ PID {pid}: {name}")
431
+ print()
432
+
433
+ print("=" * 80)
434
+
435
+
436
+ def create_wt_layout(tab_config: Dict[str, tuple[str, str]], output_dir: Optional[str] = None) -> str:
437
+ generator = WTLayoutGenerator()
438
+ return generator.create_wt_layout(tab_config, output_dir)
439
+
440
+ def run_wt_layout(tab_config: Dict[str, tuple[str, str]], session_name: Optional[str] = None) -> str:
441
+ """Create and run a Windows Terminal layout."""
442
+ generator = WTLayoutGenerator()
443
+ script_path = generator.create_wt_layout(tab_config, session_name=session_name)
444
+
445
+ # Execute the script
446
+ cmd = f"powershell -ExecutionPolicy Bypass -File \"{script_path}\""
447
+ result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
448
+
449
+ if result.returncode == 0:
450
+ print(f"Windows Terminal layout is running @ {session_name}")
451
+ return script_path
452
+ else:
453
+ logger.error(f"Failed to run Windows Terminal layout: {result.stderr}")
454
+ raise RuntimeError(f"Failed to run layout: {result.stderr}")
455
+
456
+ def run_command_in_wt_tab(command: str, tab_name: str, cwd: Optional[str]) -> str:
457
+ """Create a command to run in a new Windows Terminal tab."""
458
+ cwd_part = f"-d \"{cwd}\"" if cwd else ""
459
+
460
+ return f"""
461
+ echo "Creating new Windows Terminal tab: {tab_name}"
462
+ wt new-tab --title "{tab_name}" {cwd_part} "{command}"
463
+ """
464
+
465
+
466
+ if __name__ == "__main__":
467
+ # Example usage
468
+ sample_tabs = {
469
+ "Frontend": ("~/code", "btm"),
470
+ "Monitor": ("~", "lf"),
471
+ }
472
+
473
+ try:
474
+ # Create layout using the generator
475
+ generator = WTLayoutGenerator()
476
+ script_path = generator.create_wt_layout(sample_tabs, session_name="test_session")
477
+ print(f"✅ Windows Terminal layout created: {script_path}")
478
+
479
+ # Show preview
480
+ preview = generator.get_wt_layout_preview(sample_tabs)
481
+ print(f"\n📋 Command Preview:\n{preview}")
482
+
483
+ # Check status (won't find anything since we haven't run it)
484
+ print("\n🔍 Current status:")
485
+ generator.print_status_report()
486
+
487
+ # Show how to run the layout
488
+ print("\n▶️ To run this layout, execute:")
489
+ print(f" powershell -ExecutionPolicy Bypass -File \"{script_path}\"")
490
+
491
+ except Exception as e:
492
+ print(f"❌ Error: {e}")
493
+ import traceback
494
+ traceback.print_exc()