machineconfig 1.97__py3-none-any.whl → 2.1__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 (268) hide show
  1. machineconfig/cluster/cloud_manager.py +22 -29
  2. machineconfig/cluster/data_transfer.py +2 -3
  3. machineconfig/cluster/distribute.py +0 -2
  4. machineconfig/cluster/file_manager.py +4 -5
  5. machineconfig/cluster/job_params.py +1 -4
  6. machineconfig/cluster/loader_runner.py +8 -11
  7. machineconfig/cluster/remote_machine.py +4 -5
  8. machineconfig/cluster/script_execution.py +2 -2
  9. machineconfig/cluster/script_notify_upon_completion.py +0 -1
  10. machineconfig/cluster/sessions_managers/archive/create_zellij_template.py +4 -6
  11. machineconfig/cluster/sessions_managers/archive/session_managers.py +0 -1
  12. machineconfig/cluster/sessions_managers/enhanced_command_runner.py +35 -75
  13. machineconfig/cluster/sessions_managers/wt_local.py +113 -185
  14. machineconfig/cluster/sessions_managers/wt_local_manager.py +127 -197
  15. machineconfig/cluster/sessions_managers/wt_remote.py +60 -67
  16. machineconfig/cluster/sessions_managers/wt_remote_manager.py +110 -149
  17. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +61 -64
  18. machineconfig/cluster/sessions_managers/wt_utils/process_monitor.py +72 -172
  19. machineconfig/cluster/sessions_managers/wt_utils/remote_executor.py +27 -60
  20. machineconfig/cluster/sessions_managers/wt_utils/session_manager.py +58 -137
  21. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +46 -74
  22. machineconfig/cluster/sessions_managers/zellij_local.py +91 -147
  23. machineconfig/cluster/sessions_managers/zellij_local_manager.py +165 -190
  24. machineconfig/cluster/sessions_managers/zellij_remote.py +51 -58
  25. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +40 -46
  26. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +19 -17
  27. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +30 -31
  28. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +64 -134
  29. machineconfig/cluster/sessions_managers/zellij_utils/remote_executor.py +7 -11
  30. machineconfig/cluster/sessions_managers/zellij_utils/session_manager.py +27 -55
  31. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +14 -13
  32. machineconfig/cluster/templates/cli_click.py +0 -1
  33. machineconfig/cluster/templates/cli_gooey.py +0 -2
  34. machineconfig/cluster/templates/cli_trogon.py +0 -1
  35. machineconfig/cluster/templates/run_cloud.py +0 -1
  36. machineconfig/cluster/templates/run_cluster.py +0 -1
  37. machineconfig/cluster/templates/run_remote.py +0 -1
  38. machineconfig/cluster/templates/utils.py +27 -11
  39. machineconfig/jobs/__pycache__/__init__.cpython-313.pyc +0 -0
  40. machineconfig/jobs/linux/msc/cli_agents.sh +16 -0
  41. machineconfig/jobs/python/check_installations.py +9 -9
  42. machineconfig/jobs/python/create_bootable_media.py +0 -2
  43. machineconfig/jobs/python/python_cargo_build_share.py +2 -2
  44. machineconfig/jobs/python/python_ve_symlink.py +9 -11
  45. machineconfig/jobs/python/tasks.py +0 -1
  46. machineconfig/jobs/python/vscode/api.py +5 -5
  47. machineconfig/jobs/python/vscode/link_ve.py +20 -21
  48. machineconfig/jobs/python/vscode/select_interpreter.py +28 -29
  49. machineconfig/jobs/python/vscode/sync_code.py +14 -18
  50. machineconfig/jobs/python_custom_installers/__pycache__/__init__.cpython-313.pyc +0 -0
  51. machineconfig/jobs/python_custom_installers/archive/ngrok.py +15 -15
  52. machineconfig/jobs/python_custom_installers/dev/aider.py +10 -18
  53. machineconfig/jobs/python_custom_installers/dev/alacritty.py +12 -21
  54. machineconfig/jobs/python_custom_installers/dev/brave.py +13 -22
  55. machineconfig/jobs/python_custom_installers/dev/bypass_paywall.py +13 -20
  56. machineconfig/jobs/python_custom_installers/dev/code.py +17 -24
  57. machineconfig/jobs/python_custom_installers/dev/cursor.py +10 -21
  58. machineconfig/jobs/python_custom_installers/dev/docker_desktop.py +12 -11
  59. machineconfig/jobs/python_custom_installers/dev/espanso.py +19 -23
  60. machineconfig/jobs/python_custom_installers/dev/goes.py +9 -16
  61. machineconfig/jobs/python_custom_installers/dev/lvim.py +13 -21
  62. machineconfig/jobs/python_custom_installers/dev/nerdfont.py +15 -22
  63. machineconfig/jobs/python_custom_installers/dev/redis.py +15 -23
  64. machineconfig/jobs/python_custom_installers/dev/wezterm.py +15 -22
  65. machineconfig/jobs/python_custom_installers/dev/winget.py +32 -50
  66. machineconfig/jobs/python_custom_installers/docker.py +15 -24
  67. machineconfig/jobs/python_custom_installers/gh.py +18 -26
  68. machineconfig/jobs/python_custom_installers/hx.py +33 -17
  69. machineconfig/jobs/python_custom_installers/warp-cli.py +15 -23
  70. machineconfig/jobs/python_generic_installers/__pycache__/__init__.cpython-313.pyc +0 -0
  71. machineconfig/jobs/python_generic_installers/config.json +412 -389
  72. machineconfig/jobs/python_linux_installers/__pycache__/__init__.cpython-313.pyc +0 -0
  73. machineconfig/jobs/python_windows_installers/dev/config.json +1 -1
  74. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +1 -1
  75. machineconfig/jobs/windows/msc/cli_agents.bat +0 -0
  76. machineconfig/jobs/windows/msc/cli_agents.ps1 +0 -0
  77. machineconfig/jobs/windows/start_terminal.ps1 +1 -1
  78. machineconfig/logger.py +50 -0
  79. machineconfig/profile/create.py +50 -36
  80. machineconfig/profile/create_hardlinks.py +33 -26
  81. machineconfig/profile/shell.py +87 -60
  82. machineconfig/scripts/__pycache__/__init__.cpython-313.pyc +0 -0
  83. machineconfig/scripts/cloud/init.sh +2 -2
  84. machineconfig/scripts/linux/checkout_versions +1 -1
  85. machineconfig/scripts/linux/choose_wezterm_theme +1 -1
  86. machineconfig/scripts/linux/cloud_copy +1 -1
  87. machineconfig/scripts/linux/cloud_manager +1 -1
  88. machineconfig/scripts/linux/cloud_mount +1 -1
  89. machineconfig/scripts/linux/cloud_repo_sync +1 -1
  90. machineconfig/scripts/linux/cloud_sync +1 -1
  91. machineconfig/scripts/linux/croshell +1 -1
  92. machineconfig/scripts/linux/devops +3 -5
  93. machineconfig/scripts/linux/fire +2 -1
  94. machineconfig/scripts/linux/fire_agents +3 -3
  95. machineconfig/scripts/linux/ftpx +1 -1
  96. machineconfig/scripts/linux/gh_models +1 -1
  97. machineconfig/scripts/linux/kill_process +1 -1
  98. machineconfig/scripts/linux/mcinit +2 -2
  99. machineconfig/scripts/linux/repos +1 -1
  100. machineconfig/scripts/linux/scheduler +1 -1
  101. machineconfig/scripts/linux/start_slidev +1 -1
  102. machineconfig/scripts/linux/start_terminals +1 -1
  103. machineconfig/scripts/linux/url2md +1 -1
  104. machineconfig/scripts/linux/warp-cli.sh +122 -0
  105. machineconfig/scripts/linux/wifi_conn +1 -1
  106. machineconfig/scripts/python/__pycache__/__init__.cpython-313.pyc +0 -0
  107. machineconfig/scripts/python/__pycache__/croshell.cpython-313.pyc +0 -0
  108. machineconfig/scripts/python/__pycache__/devops.cpython-313.pyc +0 -0
  109. machineconfig/scripts/python/__pycache__/devops_devapps_install.cpython-313.pyc +0 -0
  110. machineconfig/scripts/python/__pycache__/devops_update_repos.cpython-313.pyc +0 -0
  111. machineconfig/scripts/python/__pycache__/fire_jobs.cpython-313.pyc +0 -0
  112. machineconfig/scripts/python/ai/__init__.py +0 -0
  113. machineconfig/scripts/python/ai/__pycache__/__init__.cpython-313.pyc +0 -0
  114. machineconfig/scripts/python/ai/__pycache__/generate_files.cpython-313.pyc +0 -0
  115. machineconfig/scripts/python/ai/__pycache__/mcinit.cpython-313.pyc +0 -0
  116. machineconfig/scripts/python/ai/chatmodes/Thinking-Beast-Mode.chatmode.md +337 -0
  117. machineconfig/scripts/python/ai/chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md +644 -0
  118. machineconfig/scripts/python/ai/chatmodes/deepResearch.chatmode.md +81 -0
  119. machineconfig/scripts/python/ai/configs/.gemini/settings.json +81 -0
  120. machineconfig/scripts/python/ai/generate_files.py +84 -0
  121. machineconfig/scripts/python/ai/instructions/python/dev.instructions.md +45 -0
  122. machineconfig/scripts/python/ai/mcinit.py +107 -0
  123. machineconfig/scripts/python/ai/prompts/allLintersAndTypeCheckers.prompt.md +5 -0
  124. machineconfig/scripts/python/ai/prompts/research-report-skeleton.prompt.md +38 -0
  125. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +52 -0
  126. machineconfig/scripts/python/archive/tmate_conn.py +5 -5
  127. machineconfig/scripts/python/archive/tmate_start.py +3 -3
  128. machineconfig/scripts/python/choose_wezterm_theme.py +2 -2
  129. machineconfig/scripts/python/cloud_copy.py +20 -19
  130. machineconfig/scripts/python/cloud_mount.py +10 -8
  131. machineconfig/scripts/python/cloud_repo_sync.py +15 -15
  132. machineconfig/scripts/python/cloud_sync.py +1 -1
  133. machineconfig/scripts/python/croshell.py +18 -16
  134. machineconfig/scripts/python/devops.py +6 -6
  135. machineconfig/scripts/python/devops_add_identity.py +9 -7
  136. machineconfig/scripts/python/devops_add_ssh_key.py +19 -19
  137. machineconfig/scripts/python/devops_backup_retrieve.py +14 -14
  138. machineconfig/scripts/python/devops_devapps_install.py +3 -3
  139. machineconfig/scripts/python/devops_update_repos.py +141 -53
  140. machineconfig/scripts/python/dotfile.py +3 -3
  141. machineconfig/scripts/python/fire_agents.py +202 -41
  142. machineconfig/scripts/python/fire_jobs.py +20 -21
  143. machineconfig/scripts/python/ftpx.py +4 -3
  144. machineconfig/scripts/python/gh_models.py +94 -94
  145. machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-313.pyc +0 -0
  146. machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-313.pyc +0 -0
  147. machineconfig/scripts/python/helpers/cloud_helpers.py +3 -3
  148. machineconfig/scripts/python/helpers/helpers2.py +3 -3
  149. machineconfig/scripts/python/helpers/helpers4.py +8 -7
  150. machineconfig/scripts/python/helpers/helpers5.py +7 -7
  151. machineconfig/scripts/python/helpers/repo_sync_helpers.py +2 -2
  152. machineconfig/scripts/python/mount_nfs.py +4 -3
  153. machineconfig/scripts/python/mount_nw_drive.py +4 -4
  154. machineconfig/scripts/python/mount_ssh.py +4 -3
  155. machineconfig/scripts/python/repos.py +9 -9
  156. machineconfig/scripts/python/scheduler.py +1 -1
  157. machineconfig/scripts/python/start_slidev.py +9 -8
  158. machineconfig/scripts/python/start_terminals.py +1 -1
  159. machineconfig/scripts/python/viewer.py +40 -40
  160. machineconfig/scripts/python/wifi_conn.py +65 -66
  161. machineconfig/scripts/python/wsl_windows_transfer.py +2 -2
  162. machineconfig/scripts/windows/checkout_version.ps1 +1 -3
  163. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +1 -3
  164. machineconfig/scripts/windows/cloud_copy.ps1 +2 -6
  165. machineconfig/scripts/windows/cloud_manager.ps1 +1 -1
  166. machineconfig/scripts/windows/cloud_repo_sync.ps1 +1 -2
  167. machineconfig/scripts/windows/cloud_sync.ps1 +2 -2
  168. machineconfig/scripts/windows/croshell.ps1 +2 -2
  169. machineconfig/scripts/windows/devops.ps1 +1 -4
  170. machineconfig/scripts/windows/dotfile.ps1 +1 -3
  171. machineconfig/scripts/windows/fire.ps1 +1 -1
  172. machineconfig/scripts/windows/ftpx.ps1 +2 -2
  173. machineconfig/scripts/windows/gpt.ps1 +1 -1
  174. machineconfig/scripts/windows/kill_process.ps1 +1 -2
  175. machineconfig/scripts/windows/mcinit.ps1 +2 -2
  176. machineconfig/scripts/windows/mount_nfs.ps1 +1 -1
  177. machineconfig/scripts/windows/mount_ssh.ps1 +1 -1
  178. machineconfig/scripts/windows/pomodoro.ps1 +1 -1
  179. machineconfig/scripts/windows/py2exe.ps1 +1 -3
  180. machineconfig/scripts/windows/repos.ps1 +1 -1
  181. machineconfig/scripts/windows/scheduler.ps1 +1 -1
  182. machineconfig/scripts/windows/snapshot.ps1 +2 -2
  183. machineconfig/scripts/windows/start_slidev.ps1 +1 -1
  184. machineconfig/scripts/windows/start_terminals.ps1 +1 -1
  185. machineconfig/scripts/windows/wifi_conn.ps1 +1 -1
  186. machineconfig/scripts/windows/wsl_windows_transfer.ps1 +1 -3
  187. machineconfig/settings/lf/linux/lfrc +1 -1
  188. machineconfig/settings/linters/.ruff.toml +2 -2
  189. machineconfig/settings/linters/.ruff_cache/.gitignore +2 -0
  190. machineconfig/settings/linters/.ruff_cache/CACHEDIR.TAG +1 -0
  191. machineconfig/settings/lvim/windows/archive/config_additional.lua +1 -1
  192. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +71 -71
  193. machineconfig/settings/shells/wt/settings.json +8 -8
  194. machineconfig/settings/svim/linux/init.toml +1 -1
  195. machineconfig/settings/svim/windows/init.toml +1 -1
  196. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -54
  197. machineconfig/setup_linux/web_shortcuts/interactive.sh +6 -6
  198. machineconfig/setup_linux/web_shortcuts/tmp.sh +2 -0
  199. machineconfig/setup_windows/web_shortcuts/all.ps1 +2 -2
  200. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +1 -1
  201. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +1 -1
  202. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +5 -5
  203. machineconfig/setup_windows/wt_and_pwsh/install_fonts.ps1 +51 -15
  204. machineconfig/setup_windows/wt_and_pwsh/set_pwsh_theme.py +75 -18
  205. machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +52 -42
  206. machineconfig/utils/ai/browser_user_wrapper.py +5 -5
  207. machineconfig/utils/ai/generate_file_checklist.py +19 -22
  208. machineconfig/utils/ai/url2md.py +5 -3
  209. machineconfig/utils/cloud/onedrive/setup_oauth.py +5 -4
  210. machineconfig/utils/cloud/onedrive/transaction.py +192 -227
  211. machineconfig/utils/code.py +71 -43
  212. machineconfig/utils/installer.py +77 -85
  213. machineconfig/utils/installer_utils/installer_abc.py +29 -17
  214. machineconfig/utils/installer_utils/installer_class.py +188 -83
  215. machineconfig/utils/io_save.py +3 -15
  216. machineconfig/utils/links.py +22 -11
  217. machineconfig/utils/notifications.py +197 -0
  218. machineconfig/utils/options.py +38 -25
  219. machineconfig/utils/path.py +18 -6
  220. machineconfig/utils/path_reduced.py +637 -316
  221. machineconfig/utils/procs.py +69 -63
  222. machineconfig/utils/scheduling.py +11 -13
  223. machineconfig/utils/ssh.py +351 -0
  224. machineconfig/utils/terminal.py +225 -0
  225. machineconfig/utils/utils.py +13 -12
  226. machineconfig/utils/utils2.py +43 -10
  227. machineconfig/utils/utils5.py +242 -46
  228. machineconfig/utils/ve.py +11 -6
  229. {machineconfig-1.97.dist-info → machineconfig-2.1.dist-info}/METADATA +15 -9
  230. {machineconfig-1.97.dist-info → machineconfig-2.1.dist-info}/RECORD +232 -235
  231. machineconfig/cluster/self_ssh.py +0 -57
  232. machineconfig/jobs/__pycache__/__init__.cpython-311.pyc +0 -0
  233. machineconfig/jobs/python/__pycache__/__init__.cpython-311.pyc +0 -0
  234. machineconfig/jobs/python/archive/python_tools.txt +0 -12
  235. machineconfig/jobs/python/vscode/__pycache__/select_interpreter.cpython-311.pyc +0 -0
  236. machineconfig/jobs/python_custom_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  237. machineconfig/jobs/python_generic_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  238. machineconfig/jobs/python_generic_installers/update.py +0 -3
  239. machineconfig/jobs/python_linux_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  240. machineconfig/profile/__pycache__/__init__.cpython-311.pyc +0 -0
  241. machineconfig/profile/__pycache__/create.cpython-311.pyc +0 -0
  242. machineconfig/profile/__pycache__/shell.cpython-311.pyc +0 -0
  243. machineconfig/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  244. machineconfig/scripts/linux/activate_ve +0 -87
  245. machineconfig/scripts/python/__pycache__/__init__.cpython-311.pyc +0 -0
  246. machineconfig/scripts/python/__pycache__/cloud_copy.cpython-311.pyc +0 -0
  247. machineconfig/scripts/python/__pycache__/cloud_mount.cpython-311.pyc +0 -0
  248. machineconfig/scripts/python/__pycache__/cloud_sync.cpython-311.pyc +0 -0
  249. machineconfig/scripts/python/__pycache__/croshell.cpython-311.pyc +0 -0
  250. machineconfig/scripts/python/__pycache__/devops.cpython-311.pyc +0 -0
  251. machineconfig/scripts/python/__pycache__/devops_backup_retrieve.cpython-311.pyc +0 -0
  252. machineconfig/scripts/python/__pycache__/devops_devapps_install.cpython-311.pyc +0 -0
  253. machineconfig/scripts/python/__pycache__/devops_update_repos.cpython-311.pyc +0 -0
  254. machineconfig/scripts/python/__pycache__/fire_agents.cpython-311.pyc +0 -0
  255. machineconfig/scripts/python/__pycache__/fire_jobs.cpython-311.pyc +0 -0
  256. machineconfig/scripts/python/__pycache__/get_zellij_cmd.cpython-311.pyc +0 -0
  257. machineconfig/scripts/python/__pycache__/repos.cpython-311.pyc +0 -0
  258. machineconfig/scripts/python/ai/__pycache__/init.cpython-311.pyc +0 -0
  259. machineconfig/scripts/python/ai/init.py +0 -56
  260. machineconfig/scripts/python/ai/rules/python/dev.md +0 -31
  261. machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-311.pyc +0 -0
  262. machineconfig/scripts/python/helpers/__pycache__/cloud_helpers.cpython-311.pyc +0 -0
  263. machineconfig/scripts/python/helpers/__pycache__/helpers2.cpython-311.pyc +0 -0
  264. machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-311.pyc +0 -0
  265. machineconfig/scripts/python/helpers/__pycache__/repo_sync_helpers.cpython-311.pyc +0 -0
  266. machineconfig/scripts/windows/activate_ve.ps1 +0 -54
  267. {machineconfig-1.97.dist-info → machineconfig-2.1.dist-info}/WHEEL +0 -0
  268. {machineconfig-1.97.dist-info → machineconfig-2.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,81 @@
1
+ ---
2
+ description: 'Autonomous, multi-step web research with numbered citations, cross-source verification, and a final Markdown report.'
3
+ tools: ['extensions', 'fetch', 'websearch', 'search', 'githubRepo', 'editFiles']
4
+ ---
5
+
6
+ # Deep Research mode
7
+
8
+ You are a rigorous research agent. Emulate the behavior of OpenAI “Deep Research” and Perplexity “Pro/Research” modes:
9
+ - Plan first, then execute iterative searches and browsing.
10
+ - Read broadly, follow relevant links recursively, and take structured notes.
11
+ - Attribute every non-trivial claim with numbered citations and quotes.
12
+ - Cross-verify important facts across independent, high-quality sources.
13
+ - Produce a clean, self-contained Markdown report saved to ./.ai/deep_research_$suffix.md.
14
+
15
+ This mode is read-heavy. Do not modify project code. Only create or update files under ./.ai/.
16
+
17
+ ## Inputs and outputs
18
+ - Input: a research question or task, optional `suffix` for report naming, optional provided URLs.
19
+ - Output: a Markdown report written to ./.ai/deep_research_$suffix.md and a concise chat summary with key findings and links.
20
+
21
+ ## Tools you should use
22
+ - fetch: fetch page contents for provided or discovered URLs.
23
+ - websearch: perform web searches to discover authoritative sources. Iterate as needed.
24
+ - search: only for searching the local workspace when relevant (not the web).
25
+ - githubRepo: optionally pull examples or repos if directly relevant.
26
+ - editFiles: create/update the report file under ./.ai/.
27
+
28
+ ## Execution protocol
29
+ Follow these phases every time. Provide compact progress updates between phases and after every ~3–5 tool calls: what you did and what’s next.
30
+
31
+ 1) Planning and scope
32
+ - Restate the question. Extract explicit and implicit sub-questions as a checklist.
33
+ - Define success criteria (decision to be made, comparison outcome, data needed, etc.).
34
+ - Draft a search plan: keywords, entities, time range/recency requirements, likely primary sources, and anticipated pitfalls.
35
+
36
+ 2) Initial search and source triage
37
+ - Use websearch to find diverse, reputable sources (docs, standards, primary data, peer-reviewed or recognized outlets). Prefer primary sources where possible.
38
+ - For each candidate, use fetch to open it. Capture: title, author/org, publish/update date, URL, key quotes (with exact wording), and quick trust notes.
39
+ - Track sources in a table within your working notes (not necessarily in the final report) to avoid duplication.
40
+
41
+ 3) Recursive exploration and verification
42
+ - Follow relevant links found in good sources (fetch them). Stop when additional sources stop changing conclusions materially.
43
+ - Cross-check critical numbers, timelines, and quotes against at least two independent sources when available.
44
+ - If sources conflict, explain the disagreement and weigh credibility (recency, expertise, methodology, bias, primary vs. secondary).
45
+
46
+ 4) Synthesis and reporting
47
+ - Draft a clear, structured Markdown report with:
48
+ - Title and date
49
+ - Executive summary (bulleted, 5–10 lines, with [n] citations inline)
50
+ - Key findings (short sections, each claim supported by [n] citations and brief quotes)
51
+ - Analysis (trade-offs, areas of uncertainty, limitations, and what to watch next)
52
+ - Recommendations or direct answers, if applicable (with citations)
53
+ - Appendix: Sources list with numbered entries [n], each including title, author/org, date (published/updated), URL, and quoted snippets used
54
+ - Ensure the report is readable and skimmable. Keep sentences concise.
55
+
56
+ 5) Save the report
57
+ - Determine `$suffix` in this order: (a) user-provided; else (b) a short kebab-case slug from the question; append date (YYYYMMDD) if helpful.
58
+ - Ensure directory ./.ai exists; create it if missing.
59
+ - Write the report to ./.ai/deep_research_$suffix.md using editFiles.
60
+
61
+ 6) Final checks
62
+ - Verify every non-obvious statement has a citation [n] pointing to a source in Appendix.
63
+ - Verify dates are present for sources when available; prefer the most recent reputable sources.
64
+ - Remove dead links if discovered; replace with archived or alternative sources when possible.
65
+ - Share a concise chat summary with 3–6 bullets and the saved file path.
66
+
67
+ ## Citation rules
68
+ - Use numeric references [1], [2], ... inline; match them in the Appendix.
69
+ - Quote short key phrases exactly (with quotation marks) and include context.
70
+ - Include publish/update date and access date (today) when available.
71
+ - Prefer primary documentation, official standards, authors/organizations with recognized expertise, and recent updates.
72
+
73
+ ## Guardrails and quality
74
+ - Be explicit when uncertain; avoid speculation. If evidence is weak, state it.
75
+ - Distinguish proven facts vs. interpretations. Label opinions as such.
76
+ - Avoid paywalled content if it prevents verification; seek alternative open sources or include accessible abstracts.
77
+ - If new questions arise, loop back with targeted websearch/fetch until conclusions are well-supported.
78
+
79
+ ## Usage
80
+ - In chat, switch to “Deep Research” mode. Provide your query and optionally `suffix:` or `filename:` hint (e.g., suffix: chiplet-market-2025).
81
+ - This mode will produce the report and post the saved path, e.g., ./.ai/deep_research_chiplet-market-2025.md.
@@ -0,0 +1,81 @@
1
+ {
2
+ // Appearance
3
+ "theme": "Default", // Could also be "GitHub", "Dracula", etc.
4
+
5
+ // Authentication
6
+ "selectedAuthType": "gemini-api-key", // Options: "gemini-api-key", "oauth-personal", "vertex-ai"
7
+
8
+ // Tool usage and safety
9
+ "sandbox": false, // Enable with true or specify backend ("docker", "podman")
10
+ "autoAccept": true, // Auto-approve safe tool calls
11
+ "usageStatisticsEnabled": false, // Collect anonymized usage stats
12
+ "telemetry": {
13
+ "enabled": false,
14
+ "target": "remote", // or "local"
15
+ "logPrompts": false
16
+ },
17
+
18
+ // Work environment configuration
19
+ "preferredEditor": "vim", // or "vscode", "nano", etc.
20
+ "fileFiltering": {
21
+ "respectGitIgnore": true,
22
+ "enableRecursiveFileSearch": true
23
+ },
24
+
25
+ // Context and workspace behavior
26
+ "contextFileName": "GEMINI.md", // Can also be an array of filenames
27
+ "includeDirectories": [], // e.g., ["../shared", "~/common-utils"]
28
+ "chatCompression": {
29
+ "contextPercentageThreshold": 0.5 // Threshold for compressing history
30
+ },
31
+
32
+ // Bug reporting customization
33
+ "bugCommand": {
34
+ "urlTemplate": "https://github.com/google-gemini/gemini-cli/issues/new?template=bug_report.yml&title={title}&info={info}"
35
+ },
36
+
37
+ // Extensions and integrations via MCP servers
38
+ "mcpServers": {
39
+ // Example structure; override or extend as needed
40
+ // "myServer": {
41
+ // "command": "my_mcp_tool",
42
+ // "args": [],
43
+ // "httpUrl": "http://localhost:####/mcp",
44
+ // "headers": {},
45
+ // "timeout": 10000,
46
+ // "trust": false,
47
+ // "includeTools": [],
48
+ // "excludeTools": []
49
+ // }
50
+ },
51
+
52
+ // Control which tools are available
53
+ "coreTools": [
54
+ "EditTool",
55
+ "GlobTool",
56
+ "WebSearchTool",
57
+ "ReadFileTool",
58
+ "LSTool",
59
+ "ReadManyFilesTool",
60
+ "MemoryTool",
61
+ "GrepTool",
62
+ "ShellTool",
63
+ "WebFetchTool",
64
+ "WriteFileTool"
65
+ ],
66
+ "excludeTools": [],
67
+
68
+ // Custom color themes (optional)
69
+ "customThemes": {
70
+ "MyCustomTheme": {
71
+ "name": "MyCustomTheme",
72
+ "type": "custom",
73
+ "Background": "#181818",
74
+ "Foreground": "#F8F8F2",
75
+ "AccentBlue": "#61AFEF",
76
+ "AccentPurple": "#C678DD",
77
+ "AccentGreen": "#98C379"
78
+ // Add more as desired
79
+ }
80
+ }
81
+ }
@@ -0,0 +1,84 @@
1
+
2
+ #!/usr/bin/env python3
3
+ """Script to generate a markdown table with checkboxes for all Python files in the repo."""
4
+
5
+ from pathlib import Path
6
+
7
+
8
+ def get_python_files(repo_root: Path) -> list[str]:
9
+ """Get all Python files relative to repo root."""
10
+ # Get all .py files recursively
11
+ py_files = list(repo_root.glob("**/*.py"))
12
+
13
+ # Filter out files in .venv and __pycache__ directories
14
+ filtered_files = []
15
+ for file_path in py_files:
16
+ relative_path = file_path.relative_to(repo_root)
17
+ path_parts = relative_path.parts
18
+
19
+ # Skip files in .venv or __pycache__ directories
20
+ if any(part in {".venv", "__pycache__"} for part in path_parts):
21
+ continue
22
+
23
+ filtered_files.append(str(relative_path))
24
+
25
+ return sorted(filtered_files)
26
+
27
+
28
+ def generate_markdown_table(files: list[str]) -> str:
29
+ """Generate markdown table with checkboxes."""
30
+ header = "# Python Files Checklist\n\n"
31
+ table = "| Index | File Path | Status |\n|-------|-----------|--------|\n"
32
+
33
+ for index, file_path in enumerate(files, start=1):
34
+ # Remove leading ./ if present
35
+ clean_path = file_path.lstrip('./')
36
+ table += f"| {index} | {clean_path} | - [ ] |\n"
37
+
38
+ return header + table
39
+
40
+
41
+ def main() -> None:
42
+ """Main function."""
43
+ repo_root = Path.cwd()
44
+ if not repo_root.joinpath("pyproject.toml").exists():
45
+ raise RuntimeError(f" {repo_root} Not a repo root")
46
+ output_file = repo_root / ".ai" / "all_files_with_index.md"
47
+
48
+ print(f"Repo root: {repo_root}")
49
+ print(f"Output file: {output_file}")
50
+
51
+ # Ensure output directory exists
52
+ output_file.parent.mkdir(parents=True, exist_ok=True)
53
+
54
+ # Get Python files
55
+ python_files = get_python_files(repo_root)
56
+ print(f"Found {len(python_files)} Python files")
57
+
58
+ # Generate markdown
59
+ markdown_content = generate_markdown_table(python_files)
60
+ print(f"Generated markdown content length: {len(markdown_content)}")
61
+
62
+ # Write to file
63
+ output_file.write_text(markdown_content)
64
+ print(f"Generated {output_file} with {len(python_files)} Python files")
65
+
66
+ # Create 5 symlinks to repo_root at ~/code_copies/${repo_name}_copy_{i}
67
+ import pathlib
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"
72
+ symlink_dir.mkdir(exist_ok=True)
73
+ for i in range(1, 6):
74
+ symlink_path: pathlib.Path = symlink_dir / f"{repo_name}_copy_{i}"
75
+ if symlink_path.exists() or symlink_path.is_symlink():
76
+ symlink_path.unlink()
77
+ 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
+
81
+
82
+ if __name__ == "__main__":
83
+ main()
84
+
@@ -0,0 +1,45 @@
1
+
2
+ ---
3
+ applyTo: "**/*.py"
4
+ ---
5
+
6
+ # Python Development Environment and tooling:
7
+ * If you find that uv is not available in terminal, look for how to install it in https://github.com/astral-sh/uv
8
+ * To initialize a new python project, use `cd $repo_root; uv init --python 3.13`
9
+ * To create virtual env, use `cd $repo_root; uv venv`.
10
+ * To install venv and dependency of an existing project, use `cd $repo_root; uv sync`.
11
+ * Please run any python file using `uv run $file.py`
12
+ * Same for tools, e.g. `un run python pytest $file_path`
13
+ * To add a package, use `cd $repo_root; uv add <package_name>`.
14
+ * Please never mention versions of package, so uv will bring the latest.
15
+ * On this note, I have to say that I am seriously concerned about AI using very outdated coding style.
16
+ * Use python 3.13 syntax features.
17
+ * Use modern standards, e.g. Path from pathlib.
18
+ * Never touch `pyproject.toml` manually, this file is strictly managed by `uv` tool on your behalf.
19
+ * If you are writing a test or any temporary script for discovering or undestanding something as an intermediate step, then,
20
+ please keep all your temp scripts and files under ./.ai/tmp_scripts directory, its included in .gitignore and won't litter the repo.
21
+ Its also nice if you create a subdirectory therein to contain relevant files for the task at hand, to avoid confusion with other files from other ai agents working simulataneously on other things.
22
+ * When you run a command in the terminal, please don't assume that it will run in the correct repo root directory. Always cd first to the repo root, or the desired directory, then run the command.
23
+
24
+ # Python Coding Rules
25
+ * Please type hint all the code. Use fully quilaified types, not just generics like dict, list, etc, rather dict[str, int], list[float], 'npt.NDarray[np.float32]', etc.
26
+ * Use `Any` type only if absoloutely necessary.
27
+ * Please use `# type: ignore blah blah`, to silence any warning from pyright or other linters and type checkers, but only when necessary. Otherwise, listen to them and adjust accordingly, or use cast from typing.
28
+ * Use typeddict, dataclasses and literals when necessary to avoid blackbox str or dict[str, str] etc.
29
+ * ALL functions / methods etc must clearly indicate the return type.
30
+ * Do not leave dangling imports or variables unused, prefix their name with underscore if necessary to undicate they are unused.
31
+ * Please prefer to use absolute imports, avoid relatives when possible.
32
+ * Use triple quotes and triple double quotes f-strings for string formatting and avoid when possible all goofy escaping when interpolation.
33
+ * If needed, opt for polars not pandas, whenever possible.
34
+ * when finished, run a linting static analysis check against files you touched, Any fix any mistakes.
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
+ * 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
38
+
39
+ # General Programming Ethos:
40
+ * Make sure all the code is rigorous, no lazy stuff.
41
+ * For example, always avoid default values in arguments of functions. Those are evil and cause confusion. Always be explicit in parameter passing.
42
+ * Please never ever attempt to change code files by writing meta code to do string manipulation on files, e.g. with `sed` command with terminal. Please do change the files one by one, no matter how many there is. Don't worry about time, nor context window size, its okay, take your time and do the legwork. You can stop in the middle and we will have another LLM to help with the rest.
43
+ * Please avoid writing README files and avoid docstring and comments in code unless absolutely necessary. Use clear naming conventions instead of documenting.
44
+ * Always prefer to functional style of programming over OOP.
45
+ * When passing arguments or constructing dicts or lists or tuples, avoid breaking lines too much, try to use ~ 150 characters per line before breaking to new one.
@@ -0,0 +1,107 @@
1
+
2
+
3
+ from pathlib import Path
4
+ from typing import Optional
5
+
6
+
7
+ installations = """
8
+ uv add --upgrade-package pylint pyright mypy pyrefly ty --dev # linters and type checkers
9
+ uv add --upgrade-package pytest --dev
10
+ """
11
+
12
+ def get_repo_root(path: Path) -> Optional[Path]:
13
+ from git import Repo, InvalidGitRepositoryError
14
+ try:
15
+ repo = Repo(path, search_parent_directories=True)
16
+ root = repo.working_tree_dir
17
+ if root is not None:
18
+ return Path(root)
19
+ except InvalidGitRepositoryError:
20
+ pass
21
+ return None
22
+
23
+ def add_ai_configs(repo_root: Path):
24
+ import machineconfig as mc
25
+ mc_root = Path(mc.__file__).parent
26
+
27
+ repo_root_resolved = get_repo_root(repo_root)
28
+ if repo_root_resolved is not None: repo_root = repo_root_resolved # this means you can run the command from any subdirectory of the repo.
29
+
30
+ if repo_root.joinpath("pyproject.toml").exists() is False:
31
+ 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) ")
32
+ if uv_init.strip().lower() == "y":
33
+ command_to_run = """
34
+ uv init --python 3.13
35
+ uv venv
36
+ """
37
+ import subprocess
38
+ subprocess.run(command_to_run, shell=True, check=True)
39
+ else:
40
+ print("Terminating mcinit ...")
41
+ return
42
+
43
+ instructions_repository_dir = mc_root.joinpath("scripts/python/ai/instructions")
44
+ chatmodes_dir = mc_root.joinpath("scripts/python/ai/chatmodes")
45
+ prompts_dir = mc_root.joinpath("scripts/python/ai/prompts")
46
+ # python_rules_file = instructions_repository_dir.joinpath("python/dev.md")
47
+
48
+ # VSCODE:
49
+ # as per: https://docs.github.com/en/copilot/how-tos/configure-custom-instructions/add-repository-instructions
50
+ # Copilot Chat on github website chat & basic guideline.
51
+ repo_root.joinpath(".github/chatmodes").mkdir(parents=True, exist_ok=True)
52
+ repo_root.joinpath(".github/prompts").mkdir(parents=True, exist_ok=True)
53
+ repo_root.joinpath(".github/instructions").mkdir(parents=True, exist_ok=True)
54
+ for a_chatmode in chatmodes_dir.iterdir():
55
+ repo_root.joinpath(".github/chatmodes", a_chatmode.name.split(".")[0] + ".chatmode.md").write_text(data=a_chatmode.read_text(encoding="utf-8"), encoding="utf-8")
56
+ for a_prompt in prompts_dir.iterdir():
57
+ repo_root.joinpath(".github/prompts", a_prompt.name.split(".")[0] + ".prompt.md").write_text(data=a_prompt.read_text(encoding="utf-8"), encoding="utf-8")
58
+ for an_instruction in instructions_repository_dir.rglob("*.md"):
59
+ repo_root.joinpath(".github/instructions", an_instruction.name.split(".")[0] + ".instruction.md").write_text(data=an_instruction.read_text(encoding="utf-8"), encoding="utf-8")
60
+ tmp = repo_root.joinpath(".github/copilot-instructions.md")
61
+
62
+ generic_instructions = instructions_repository_dir.joinpath("python/dev.instructions.md")
63
+ tmp.write_text(data=generic_instructions.read_text(encoding="utf-8"), encoding="utf-8")
64
+
65
+ # CURSOR, GEMINI, CLAUDE CODE, CRUSH, CLINE.
66
+ tmp = repo_root.joinpath(".cursor/rules/python_dev.mdc")
67
+ tmp.parent.mkdir(parents=True, exist_ok=True)
68
+ tmp.write_text(data=generic_instructions.read_text(encoding="utf-8"), encoding="utf-8")
69
+ tmp = repo_root.joinpath("CLAUDE.md")
70
+ tmp.write_text(data=generic_instructions.read_text(encoding="utf-8"), encoding="utf-8")
71
+ tmp = repo_root.joinpath("CRUSH.md")
72
+ tmp.write_text(data=generic_instructions.read_text(encoding="utf-8"), encoding="utf-8")
73
+
74
+ tmp = repo_root.joinpath("GEMINI.md")
75
+ tmp.write_text(data=generic_instructions.read_text(encoding="utf-8"), encoding="utf-8")
76
+ gemini_settings = mc_root.joinpath("scripts/python/ai/configs/.gemini/settings.json")
77
+ repo_root.joinpath(".gemini").mkdir(parents=True, exist_ok=True)
78
+ repo_root.joinpath(".gemini/settings.json").write_text(data=gemini_settings.read_text(encoding="utf-8"), encoding="utf-8")
79
+
80
+ tmp = repo_root.joinpath(".clinerules")
81
+ tmp.mkdir(parents=True, exist_ok=True)
82
+ tmp.joinpath("python_dev.md").write_text(data=generic_instructions.read_text(encoding="utf-8"), encoding="utf-8")
83
+
84
+ # OTHERS
85
+ scripts_dir = mc_root.joinpath("scripts/python/ai/scripts")
86
+ repo_root.joinpath(".scripts").mkdir(parents=True, exist_ok=True)
87
+ for a_script in scripts_dir.iterdir():
88
+ repo_root.joinpath(".scripts", a_script.name).write_text(data=a_script.read_text(encoding="utf-8"), encoding="utf-8")
89
+
90
+ dot_ai_dir = repo_root.joinpath(".ai")
91
+ dot_ai_dir.mkdir(parents=True, exist_ok=True)
92
+ dot_git_ignore_path = repo_root.joinpath(".gitignore")
93
+ if dot_git_ignore_path.exists():
94
+ dot_git_ignore_content = dot_git_ignore_path.read_text(encoding="utf-8")
95
+ to_add: list[str] = []
96
+ to_check_for: list[str] = [".links", "notebooks", ".ai", ".scripts",
97
+ "GEMINI.md", "CLAUDE.md", ".cursor", ".github"]
98
+ for item in to_check_for:
99
+ if item not in dot_git_ignore_content:
100
+ to_add.append(item)
101
+ # if "*.ipynb"
102
+ if len(to_add) > 0:
103
+ dot_git_ignore_path.write_text(data=dot_git_ignore_content + "\n" + "\n".join(to_add), encoding="utf-8")
104
+
105
+
106
+ if __name__ == "__main__":
107
+ add_ai_configs(repo_root=Path.cwd())
@@ -0,0 +1,5 @@
1
+ ---
2
+ mode: agent
3
+ ---
4
+
5
+ please run the following
@@ -0,0 +1,38 @@
1
+ ```prompt
2
+ ---
3
+ description: 'A minimal skeleton for deep research reports.'
4
+ ---
5
+
6
+ # <Title>
7
+
8
+ Date: <YYYY-MM-DD>
9
+
10
+ ## Executive summary
11
+ - <key point 1> [n]
12
+ - <key point 2> [n]
13
+ - <key point 3> [n]
14
+
15
+ ## Key findings
16
+ ### <Finding A>
17
+ - Claim: <text> [n]
18
+ - Evidence: "<quote>" [n]
19
+ - Notes: <brief trust/limitations>
20
+
21
+ ### <Finding B>
22
+ - Claim: <text> [n]
23
+ - Evidence: "<quote>" [n]
24
+
25
+ ## Analysis
26
+ - Trade-offs
27
+ - Uncertainties
28
+ - What to watch next
29
+
30
+ ## Recommendations / Direct answer
31
+ - <concise recommendation or answer> [n]
32
+
33
+ ## Appendix: Sources
34
+ [1] <Title> — <Author/Org>, <Date>. <URL>
35
+ [2] <Title> — <Author/Org>, <Date>. <URL>
36
+ [3] <Title> — <Author/Org>, <Date>. <URL>
37
+
38
+ ```
@@ -0,0 +1,52 @@
1
+
2
+ # gotch1: make sure we are in the right directory: repo root. Solution: check if .pyproject.toml exists, otherwise stop.
3
+ if [ ! -f "./pyproject.toml" ]; then
4
+ echo "Error: pyproject.toml not found in the current directory. Please run this script from the root of a Python project."
5
+ exit 1
6
+ fi
7
+
8
+ echo "Running linting and type checking..."
9
+
10
+ echo "Setting up environment..."
11
+ # uv add pylint pyright mypy pyrefly ruff ty --dev # linters and type checkers
12
+ # uv add --dev cleanpy pylint pyright mypy pyrefly --upgrade-package cleanpy pylint pyright mypy pyrefly
13
+ uv add --dev pyright --upgrade-package pyright
14
+ uv add --dev pylint --upgrade-package pylint
15
+ uv add --dev mypy --upgrade-package mypy
16
+ uv add --dev pyrefly --upgrade-package pyrefly
17
+ uv add --dev cleanpy --upgrade-package cleanpy
18
+
19
+
20
+ uv add types-requests types-toml types-PyYAML types-pytz types-paramiko types-urllib3 --dev
21
+ uv add types-mysqlclient types-SQLAlchemy --dev
22
+
23
+ uv run -m cleanpy .
24
+ uv run -m ruff clean
25
+ # uv run -m ruff format .
26
+ uv run -m ruff check . --fix
27
+ uv run --with machineconfig -m machineconfig.scripts.python.ai.generate_files
28
+
29
+ mkdir .linters
30
+
31
+ echo "Running pyright..."
32
+ rm ./.linters/pyright_result.md || true
33
+ uv run pyright . > ./.linters/pyright_result.md
34
+ echo "Results of pyright are in ./.linters/pyright_result.md"
35
+
36
+ rm ./.linters/mypy_result.md || true
37
+ uv run mypy . > ./.linters/mypy_result.md
38
+ echo "Results of mypy are in ./.linters/mypy_result.md"
39
+
40
+ rm ./.linters/pylint_result.md || true
41
+ uv run pylint ./src/ > ./.linters/pylint_result.md
42
+ echo "Results of pylint are in ./.linters/pylint_result.md"
43
+
44
+ rm ./.linters/pylint_result.md || true
45
+ uv run pyrefly check . > ./.linters/pyrefly_result.md
46
+ echo "Results of pyrefly are in ./.linters/pyrefly_result.md"
47
+
48
+ rm ./.linters/ruff_result.md || true
49
+ uv run ruff check . > ./.linters/ruff_result.md
50
+ echo "Results of ruff are in ./.linters/ruff_result.md"
51
+
52
+ echo "All done! Please check the .linters directory for results."
@@ -21,19 +21,19 @@ def get_conn_string(sess_name: str) -> str:
21
21
 
22
22
  def main():
23
23
  console.print(Panel("🔌 Tmate Connection Manager", title="[bold]Welcome[/bold]"))
24
-
24
+
25
25
  parser = argparse.ArgumentParser(description='Tmate launcher')
26
26
  parser.add_argument("sess_name", help="session name", default=random.choices(list(string.digits + string.ascii_letters), k=20))
27
27
  args = parser.parse_args()
28
-
28
+
29
29
  console.print(f"🔍 Looking up session: {args.sess_name}")
30
30
  conn_string = get_conn_string(args.sess_name)
31
-
31
+
32
32
  console.print(Panel(f"SSH Connection String: ssh {conn_string}", title="[bold green]SSH Connection[/bold green]"))
33
-
33
+
34
34
  console.print("🚀 Connecting to tmate session...")
35
35
  os.system(f"ssh {conn_string}")
36
-
36
+
37
37
  console.print("✅ Connection closed")
38
38
 
39
39
 
@@ -30,13 +30,13 @@ def main():
30
30
  console.print(f"🔍 Looking up session configuration: {args.sess_name}")
31
31
  sess_name = creds['sessions_names'][args.sess_name]
32
32
  api_key = creds['keys']['api_key']
33
-
33
+
34
34
  console.print(Panel(f"🚀 Starting tmate session: {sess_name}", title="[bold green]Session Info[/bold green]"))
35
-
35
+
36
36
  res = f"tmate -a ~/.ssh/authorized_keys -k {api_key} -n {sess_name} -F"
37
37
  console.print("[bold cyan]Running:[/bold cyan] tmate with configured API key and session name")
38
38
  os.system(res)
39
-
39
+
40
40
  console.print("[green]Tmate session ended[/green]")
41
41
 
42
42
 
@@ -51,13 +51,13 @@ def main2():
51
51
 
52
52
  def set_theme(theme: str):
53
53
  print(f"🔄 Setting WezTerm theme to: {theme}")
54
- txt_lines = PathExtended("~/.config/wezterm/wezterm.lua").expanduser().read_text().splitlines()
54
+ txt_lines = PathExtended("~/.config/wezterm/wezterm.lua").expanduser().read_text(encoding="utf-8").splitlines()
55
55
  res_lines = []
56
56
  for line in txt_lines:
57
57
  if 'config.color_scheme = ' in line:
58
58
  res_lines.append(f"config.color_scheme = '{theme}'")
59
59
  else: res_lines.append(line)
60
- PathExtended("~/.config/wezterm/wezterm.lua").expanduser().write_text('\n'.join(res_lines))
60
+ PathExtended("~/.config/wezterm/wezterm.lua").expanduser().write_text('\n'.join(res_lines), encoding="utf-8")
61
61
  time.sleep(0.1)
62
62
  print("💾 Configuration saved")
63
63