machineconfig 6.99__py3-none-any.whl → 7.32__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 (28) hide show
  1. machineconfig/profile/create_links.py +1 -1
  2. machineconfig/profile/create_links_export.py +2 -2
  3. machineconfig/scripts/linux/mcfgs +3 -3
  4. machineconfig/scripts/python/define.py +26 -0
  5. machineconfig/scripts/python/env_manager/path_manager_tui.py +1 -1
  6. machineconfig/scripts/python/helpers_devops/cli_config.py +9 -14
  7. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +53 -53
  8. machineconfig/scripts/python/helpers_devops/cli_self.py +3 -3
  9. machineconfig/scripts/python/helpers_devops/cli_share_server.py +29 -10
  10. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +1 -1
  11. machineconfig/scripts/python/nw/mount_nfs +1 -1
  12. machineconfig/scripts/python/terminal.py +1 -1
  13. machineconfig/scripts/windows/mcfgs.ps1 +3 -2
  14. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +1 -1
  15. machineconfig/settings/shells/bash/init.sh +1 -1
  16. machineconfig/setup_linux/__init__.py +1 -0
  17. machineconfig/setup_linux/web_shortcuts/interactive.sh +9 -9
  18. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +9 -9
  19. machineconfig/utils/links.py +53 -43
  20. machineconfig/utils/ssh.py +1 -1
  21. machineconfig/utils/upgrade_packages.py +4 -2
  22. {machineconfig-6.99.dist-info → machineconfig-7.32.dist-info}/METADATA +13 -3
  23. {machineconfig-6.99.dist-info → machineconfig-7.32.dist-info}/RECORD +26 -27
  24. {machineconfig-6.99.dist-info → machineconfig-7.32.dist-info}/entry_points.txt +2 -0
  25. machineconfig/scripts/linux/term +0 -39
  26. machineconfig/scripts/windows/term.ps1 +0 -48
  27. {machineconfig-6.99.dist-info → machineconfig-7.32.dist-info}/WHEEL +0 -0
  28. {machineconfig-6.99.dist-info → machineconfig-7.32.dist-info}/top_level.txt +0 -0
@@ -79,7 +79,7 @@ def read_mapper() -> MapperFileData:
79
79
 
80
80
 
81
81
  def apply_mapper(mapper_data: dict[str, list[ConfigMapper]],
82
- on_conflict: Literal["throw-error", "overwriteSelfManaged", "backupSelfManaged", "overwriteDefaultPath", "backupDefaultPath"],
82
+ on_conflict: Literal["throw-error", "overwrite-self-managed", "backup-self-managed", "overwrite-default-path", "backup-default-path"],
83
83
  method: Literal["symlink", "copy"]
84
84
  ):
85
85
  operation_records: list[OperationRecord] = []
@@ -4,7 +4,7 @@ from typing import Optional, Literal, Annotated
4
4
 
5
5
 
6
6
  def main_public_from_parser(method: Annotated[Literal["symlink", "copy"], typer.Option(..., help="Method to use for setting up the config file.")],
7
- on_conflict: Annotated[Literal["throw-error", "overwriteDefaultPath", "backupDefaultPath"], typer.Option(..., help="Action to take on conflict")],
7
+ on_conflict: Annotated[Literal["throw-error", "overwrite-default-path", "backup-default-path"], typer.Option(..., help="Action to take on conflict")],
8
8
  which: Annotated[Optional[str], typer.Option(..., help="Specific items to process")] = None,
9
9
  interactive: Annotated[bool, typer.Option(..., help="Run in interactive mode")] = False):
10
10
  """Terminology:
@@ -32,7 +32,7 @@ def main_public_from_parser(method: Annotated[Literal["symlink", "copy"], typer.
32
32
 
33
33
 
34
34
  def main_private_from_parser(method: Annotated[Literal["symlink", "copy"], typer.Option(..., help="Method to use for linking files")],
35
- on_conflict: Annotated[Literal["throw-error", "overwriteSelfManaged", "backupSelfManaged", "overwriteDefaultPath", "backupDefaultPath"], typer.Option(..., help="Action to take on conflict")] = "throw-error",
35
+ on_conflict: Annotated[Literal["throw-error", "overwrite-self-managed", "backup-self-managed", "overwrite-default-path", "backup-default-path"], typer.Option(..., help="Action to take on conflict")] = "throw-error",
36
36
  which: Annotated[Optional[str], typer.Option(..., help="Specific items to process")] = None,
37
37
  interactive: Annotated[bool, typer.Option(..., help="Run in interactive mode")] = False):
38
38
  from machineconfig.profile.create_links import ConfigMapper, read_mapper
@@ -27,18 +27,18 @@ wrap_in_shell_script() {
27
27
  "$command" "$@"
28
28
 
29
29
  if [[ -f "$OP_PROGRAM_PATH" ]]; then
30
- printf "%b\n" "${GREEN} Found op program:${RESET} ${OP_PROGRAM_PATH}"
30
+ printf "%b\n" "${GREEN}🚀 Taking over from python script @ ${OP_PROGRAM_PATH}${RESET}"
31
31
  bat --style=plain --paging=never "$OP_PROGRAM_PATH"
32
32
  printf "%b\n" "${GREEN}▶ Running...${RESET}"
33
33
  . "$OP_PROGRAM_PATH"
34
34
  status=$?
35
35
  if [[ $status -eq 0 ]]; then
36
- printf "%b\n" "${GREEN}✅ Completed successfully (exit ${status})${RESET}"
36
+ printf "%b\n" "${GREEN}✅ '${command}' execution completed.${RESET}"
37
37
  else
38
38
  printf "%b\n" "${YELLOW}⚠️ Program exited with status ${status}${RESET}"
39
39
  fi
40
40
  else
41
- printf "%b\n" "${YELLOW}⚠️ No op program found at: ${OP_PROGRAM_PATH}${RESET}"
41
+ printf "%b\n" "${GREEN} '${command}' execution completed.${RESET}"
42
42
  fi
43
43
  }
44
44
 
@@ -0,0 +1,26 @@
1
+
2
+ """
3
+ Minimalist programs that only print scripts without frills so it can be sourced by by shell.
4
+ """
5
+
6
+
7
+ import typer
8
+ import platform
9
+
10
+
11
+ def define_scripts():
12
+ if platform.system() != "Linux":
13
+ raise RuntimeError("This command is only supported on Linux systems.")
14
+ from machineconfig.setup_linux import INTERACTIVE as script_path
15
+ script = script_path.read_text(encoding="utf-8")
16
+ print(script)
17
+
18
+
19
+ def main():
20
+ app = typer.Typer(add_completion=False, no_args_is_help=True)
21
+ app.command(name="scripts", help="define all scripts", no_args_is_help=False)(define_scripts)
22
+ app()
23
+
24
+
25
+ # if __name__ == "__main__":
26
+ # main()
@@ -2,7 +2,7 @@
2
2
  # /// script
3
3
  # requires-python = ">=3.13"
4
4
  # dependencies = [
5
- # "machineconfig>=6.99",
5
+ # "machineconfig>=7.32",
6
6
  # "textual",
7
7
  # "pyperclip",
8
8
  # ]
@@ -3,33 +3,26 @@
3
3
  from typing import Literal, Annotated, Optional
4
4
  from pathlib import Path
5
5
  import typer
6
-
6
+ import machineconfig.scripts.python.helpers_devops.cli_config_dotfile as dotfile_module
7
7
 
8
8
 
9
9
  def private(method: Annotated[Literal["symlink", "copy"], typer.Option(..., "--method", "-m", help="Method to use for linking files")],
10
- on_conflict: Annotated[Literal["throw-error", "overwriteSelfManaged", "backupSelfManaged", "overwriteDefaultPath", "backupDefaultPath"], typer.Option(..., "--on-conflict", "-o", help="Action to take on conflict")] = "throw-error",
10
+ on_conflict: Annotated[Literal["throw-error", "overwrite-self-managed", "backup-self-managed", "overwrite-default-path", "backup-default-path"], typer.Option(..., "--on-conflict", "-o", help="Action to take on conflict")] = "throw-error",
11
11
  which: Annotated[Optional[str], typer.Option(..., "--which", "-w", help="Specific items to process")] = None,
12
12
  interactive: Annotated[bool, typer.Option(..., "--interactive", "-ia", help="Run in interactive mode")] = False):
13
13
  """🔗 Manage private configuration files."""
14
14
  import machineconfig.profile.create_links_export as create_links_export
15
15
  create_links_export.main_private_from_parser(method=method, on_conflict=on_conflict, which=which, interactive=interactive)
16
16
 
17
+
17
18
  def public(method: Annotated[Literal["symlink", "copy"], typer.Option(..., "--method", "-m", help="Method to use for setting up the config file.")],
18
- on_conflict: Annotated[Literal["throw-error", "overwriteDefaultPath", "backupDefaultPath"], typer.Option(..., "--on-conflict", "-o", help="Action to take on conflict")] = "throw-error",
19
+ on_conflict: Annotated[Literal["throw-error", "overwrite-default-path", "backup-default-path"], typer.Option(..., "--on-conflict", "-o", help="Action to take on conflict")] = "throw-error",
19
20
  which: Annotated[Optional[str], typer.Option(..., "--which", "-w", help="Specific items to process")] = None,
20
21
  interactive: Annotated[bool, typer.Option(..., "--interactive", "-ia", help="Run in interactive mode")] = False):
21
22
  """🔗 Manage public configuration files."""
22
23
  import machineconfig.profile.create_links_export as create_links_export
23
24
  create_links_export.main_public_from_parser(method=method, on_conflict=on_conflict, which=which, interactive=interactive)
24
25
 
25
- def dotfile(file: Annotated[str, typer.Argument(help="file/folder path.")],
26
- overwrite: Annotated[bool, typer.Option("--overwrite", "-o", help="Overwrite.")] = False,
27
- dest: Annotated[str, typer.Option("--dest", "-d", help="destination folder")] = "",
28
- ):
29
- """🔗 Manage dotfiles."""
30
- import machineconfig.scripts.python.helpers_devops.cli_config_dotfile as dotfile_module
31
- dotfile_module.main(file=file, overwrite=overwrite, dest=dest)
32
-
33
26
 
34
27
  def shell():
35
28
  """🔗 Configure your shell profile."""
@@ -46,7 +39,7 @@ def path():
46
39
  uv_with = ["textual"]
47
40
  uv_project_dir = None
48
41
  if not Path.home().joinpath("code/machineconfig").exists():
49
- uv_with.append("machineconfig>=6.99")
42
+ uv_with.append("machineconfig>=7.32")
50
43
  else:
51
44
  uv_project_dir = str(Path.home().joinpath("code/machineconfig"))
52
45
  run_shell_script(get_uv_command_executing_python_script(python_script=path.read_text(encoding="utf-8"), uv_with=uv_with, uv_project_dir=uv_project_dir)[0])
@@ -59,6 +52,7 @@ def pwsh_theme():
59
52
  import subprocess
60
53
  subprocess.run(["pwsh", "-File", str(file)])
61
54
 
55
+
62
56
  def starship_theme():
63
57
  """🔗 Select starship prompt theme."""
64
58
  import subprocess
@@ -87,6 +81,7 @@ def starship_theme():
87
81
  except ValueError:
88
82
  typer.echo("❌ Please enter a valid number")
89
83
 
84
+
90
85
  def copy_assets(which: Annotated[Literal["scripts", "settings", "both"], typer.Argument(..., help="Which assets to copy")]):
91
86
  """🔗 Copy asset files from library to machine."""
92
87
  import machineconfig.profile.create_helper as create_helper
@@ -104,8 +99,8 @@ def get_app():
104
99
  config_apps.command("v", no_args_is_help=True, hidden=True)(private)
105
100
  config_apps.command("public", no_args_is_help=True, help="🔗 [b] Manage public configuration files.")(public)
106
101
  config_apps.command("b", no_args_is_help=True, help="Manage public configuration files.", hidden=True)(public)
107
- config_apps.command("dotfile", no_args_is_help=True, help="🔗 [d] Manage dotfiles.")(dotfile)
108
- config_apps.command("d", no_args_is_help=True, hidden=True)(dotfile)
102
+ config_apps.command("dotfile", no_args_is_help=True, help="🔗 [d] Manage dotfiles.")(dotfile_module.main)
103
+ config_apps.command("d", no_args_is_help=True, hidden=True)(dotfile_module.main)
109
104
  config_apps.command("shell", no_args_is_help=False, help="🔗 [s] Configure your shell profile.")(shell)
110
105
  config_apps.command("s", no_args_is_help=False, help="Configure your shell profile.", hidden=True)(shell)
111
106
  config_apps.command("path", no_args_is_help=False, help="📚 [p] NAVIGATE PATH variable with TUI")(path)
@@ -1,72 +1,72 @@
1
- """Like yadm and dotter."""
2
1
 
3
- from typing import Annotated
2
+ """Like yadm and dotter."""
4
3
 
4
+ from typing import Annotated, Literal
5
5
  import typer
6
6
 
7
7
 
8
8
  def main(
9
9
  file: Annotated[str, typer.Argument(help="file/folder path.")],
10
- overwrite: Annotated[bool, typer.Option("--overwrite", "-o", help="Overwrite.")] = False,
11
- dest: Annotated[str, typer.Option("--dest", "-d", help="destination folder")] = "",
12
- ) -> None:
13
-
10
+ method: Annotated[Literal["symlink", "copy"], typer.Option(..., "--method", "-m", help="Method to use for linking files")] = "copy",
11
+ on_conflict: Annotated[Literal["throw-error", "overwrite-self-managed", "backup-self-managed", "overwrite-default-path", "backup-default-path"], typer.Option(..., "--on-conflict", "-o", help="Action to take on conflict")] = "throw-error",
12
+ sensitivity: Annotated[Literal["private", "public"], typer.Option(..., "--sensitivity", "-s", help="Sensitivity of the config file.")] = "private",
13
+ destination: Annotated[str, typer.Option("--destination", "-d", help="destination folder (override the default, use at your own risk)")] = "",) -> None:
14
14
  from rich.console import Console
15
15
  from rich.panel import Panel
16
+ from machineconfig.utils.links import symlink_map, copy_map
17
+ from pathlib import Path
18
+ match sensitivity:
19
+ case "private":
20
+ backup_root = Path.home().joinpath("dotfiles/mapper")
21
+ case "public":
22
+ from machineconfig.utils.source_of_truth import CONFIG_ROOT
23
+ backup_root = Path(CONFIG_ROOT).joinpath("dotfiles/mapper")
16
24
 
17
- from machineconfig.utils.links import symlink_map
18
- from machineconfig.utils.path_extended import PathExtended
19
- from machineconfig.utils.source_of_truth import CONFIG_ROOT
20
25
  console = Console()
21
- orig_path = PathExtended(file).expanduser().absolute()
22
- if dest == "":
23
- if "Local" in str(orig_path):
24
- junction = orig_path.split(at="Local", sep=-1)[1]
25
- elif "Roaming" in str(orig_path):
26
- junction = orig_path.split(at="Roaming", sep=-1)[1]
27
- elif ".config" in str(orig_path):
28
- junction = orig_path.split(at=".config", sep=-1)[1]
29
- else:
30
- junction = orig_path.rel2home()
31
- new_path = PathExtended(CONFIG_ROOT).parent.parent.joinpath(junction)
26
+ orig_path = Path(file).expanduser().absolute()
27
+ if destination == "":
28
+ new_path = backup_root.joinpath(orig_path.relative_to(Path.home()))
29
+ new_path.parent.mkdir(parents=True, exist_ok=True)
32
30
  else:
33
- dest_path = PathExtended(dest).expanduser().absolute()
31
+ dest_path = Path(destination).expanduser().absolute()
34
32
  dest_path.mkdir(parents=True, exist_ok=True)
35
33
  new_path = dest_path.joinpath(orig_path.name)
36
34
 
37
- symlink_map(config_file_default_path=orig_path, self_managed_config_file_path=new_path, on_conflict="throw-error")
38
-
39
- console.print(
40
- Panel(
41
- "\n".join(
42
- [
43
- " Symbolic link created successfully!",
44
- "🔄 Add the following snippet to mapper.toml to persist this mapping:",
45
- ]
46
- ),
47
- title="Symlink Created",
48
- border_style="green",
49
- padding=(1, 2),
50
- )
51
- )
52
-
53
- mapper_snippet = "\n".join(
54
- [
55
- f"[bold]📝 Edit configuration file:[/] [cyan]nano {PathExtended(CONFIG_ROOT)}/symlinks/mapper.toml[/cyan]",
56
- "",
57
- f"[{new_path.parent.name}]",
58
- f"{orig_path.name.split('.')[0]} = {{ this = '{orig_path.collapseuser().as_posix()}', to_this = '{new_path.collapseuser().as_posix()}' }}",
59
- ]
60
- )
35
+ from machineconfig.utils.path_extended import PathExtended
36
+ match method:
37
+ case "copy":
38
+ try:
39
+ copy_map(config_file_default_path=PathExtended(orig_path), self_managed_config_file_path=PathExtended(new_path), on_conflict=on_conflict)
40
+ except Exception as e:
41
+ typer.echo(f"[red]Error:[/] {e}")
42
+ typer.Exit(code=1)
43
+ return
44
+ case "symlink":
45
+ try:
46
+ symlink_map(config_file_default_path=PathExtended(orig_path), self_managed_config_file_path=PathExtended(new_path), on_conflict=on_conflict)
47
+ except Exception as e:
48
+ typer.echo(f"[red]Error:[/] {e}")
49
+ typer.Exit(code=1)
50
+ case _:
51
+ raise ValueError(f"Unknown method: {method}")
52
+ console.print(Panel("\n".join(["✅ Symbolic link created successfully!", "🔄 Add the following snippet to mapper.toml to persist this mapping:",]), title="Symlink Created", border_style="green", padding=(1, 2),))
61
53
 
62
- console.print(
63
- Panel(
64
- mapper_snippet,
65
- title="Mapper Entry",
66
- border_style="cyan",
67
- padding=(1, 2),
68
- )
69
- )
54
+ # mapper_snippet = "\n".join(
55
+ # [
56
+ # f"[bold]📝 Edit configuration file:[/] [cyan]nano {PathExtended(CONFIG_ROOT)}/symlinks/mapper.toml[/cyan]",
57
+ # "",
58
+ # f"[{new_path.parent.name}]",
59
+ # f"{orig_path.name.split('.')[0]} = {{ this = '{orig_path.collapseuser().as_posix()}', to_this = '{new_path.collapseuser().as_posix()}' }}",
60
+ # ]
61
+ # )
62
+ # console.print(
63
+ # Panel(
64
+ # mapper_snippet,
65
+ # title="Mapper Entry",
66
+ # border_style="cyan",
67
+ # padding=(1, 2),
68
+ # )
69
+ # )
70
70
 
71
71
 
72
72
  def arg_parser() -> None:
@@ -48,9 +48,9 @@ def install(no_copy_assets: Annotated[bool, typer.Option("--no-assets-copy", "-n
48
48
  else:
49
49
  import platform
50
50
  if platform.system() == "Windows":
51
- run_shell_script(r"""& "$HOME\.local\bin\uv.exe" tool install --upgrade "machineconfig>=6.99" """)
51
+ run_shell_script(r"""& "$HOME\.local\bin\uv.exe" tool install --upgrade "machineconfig>=7.32" """)
52
52
  else:
53
- run_shell_script("""$HOME/.local/bin/uv tool install --upgrade "machineconfig>=6.99" """)
53
+ run_shell_script("""$HOME/.local/bin/uv tool install --upgrade "machineconfig>=7.32" """)
54
54
  from machineconfig.profile.create_shell_profile import create_default_shell_profile
55
55
  if not no_copy_assets:
56
56
  create_default_shell_profile() # involves copying assets too
@@ -75,7 +75,7 @@ def navigate():
75
75
  path = Path(navigator.__file__).resolve().parent.joinpath("devops_navigator.py")
76
76
  from machineconfig.utils.code import run_shell_script
77
77
  if Path.home().joinpath("code/machineconfig").exists(): executable = f"""--project "{str(Path.home().joinpath("code/machineconfig"))}" --with textual"""
78
- else: executable = """--with "machineconfig>=6.99,textual" """
78
+ else: executable = """--with "machineconfig>=7.32,textual" """
79
79
  run_shell_script(f"""uv run {executable} {path}""")
80
80
 
81
81
 
@@ -140,7 +140,8 @@ croc {relay_arg} send {zip_arg} {qrcode_arg} {text_arg} {path_arg}"""
140
140
  exit_then_run_shell_script(script=script, strict=False)
141
141
 
142
142
 
143
- def share_file_receive(code_args: Annotated[list[str], typer.Argument(help="Receive code or relay command. Examples: '7121-donor-olympic-bicycle' or '--relay 10.17.62.206:443 7121-donor-olympic-bicycle'")],) -> None:
143
+ def share_file_receive(code_args: Annotated[list[str], typer.Argument(help="Receive code or relay command. Examples: '7121-donor-olympic-bicycle' or '--relay 10.17.62.206:443 7121-donor-olympic-bicycle'")],
144
+ ) -> None:
144
145
  """Receive a file using croc with relay server.
145
146
  Usage examples:
146
147
  devops network receive 7121-donor-olympic-bicycle
@@ -150,9 +151,22 @@ Usage examples:
150
151
  from machineconfig.utils.installer_utils.installer import install_if_missing
151
152
  install_if_missing(which="croc")
152
153
  import platform
154
+ import sys
153
155
 
154
156
  is_windows = platform.system() == "Windows"
155
157
 
158
+ # If no args passed via typer, try to get them from sys.argv directly
159
+ # This handles the case where -- was used and arguments weren't parsed by typer
160
+ if not code_args or (len(code_args) == 1 and code_args[0] in ['--relay', 'croc']):
161
+ # Find the index of 'rx' or 'receive' in sys.argv and get everything after it
162
+ try:
163
+ for i, arg in enumerate(sys.argv):
164
+ if arg in ['rx', 'receive', 'r'] and i + 1 < len(sys.argv):
165
+ code_args = sys.argv[i + 1:]
166
+ break
167
+ except Exception:
168
+ pass
169
+
156
170
  # Join all arguments
157
171
  input_str = " ".join(code_args)
158
172
  tokens = input_str.split()
@@ -161,25 +175,30 @@ Usage examples:
161
175
  relay_server: str | None = None
162
176
  secret_code: str | None = None
163
177
 
164
- # Remove 'croc' from tokens if present
165
- tokens = [t for t in tokens if t != 'croc']
178
+ # Remove 'croc' and 'export' from tokens if present
179
+ tokens = [t for t in tokens if t not in ['croc', 'export']]
166
180
 
167
181
  # Look for --relay flag and capture next token
168
- if '--relay' in tokens:
169
- relay_idx = tokens.index('--relay')
170
- if relay_idx + 1 < len(tokens):
171
- relay_server = tokens[relay_idx + 1]
182
+ relay_idx = -1
183
+ for i, token in enumerate(tokens):
184
+ if token == '--relay' and i + 1 < len(tokens):
185
+ relay_server = tokens[i + 1]
186
+ relay_idx = i
187
+ break
172
188
 
173
189
  # Look for CROC_SECRET= prefix in any token
174
190
  for token in tokens:
175
191
  if token.startswith('CROC_SECRET='):
176
- secret_code = token.split('=', 1)[1].strip('"')
192
+ secret_code = token.split('=', 1)[1].strip('"').strip("'")
177
193
  break
178
194
 
179
195
  # If no secret code found yet, look for tokens with dashes (typical pattern: number-word-word-word)
196
+ # Skip relay server and relay flag
180
197
  if not secret_code:
181
- for token in tokens:
182
- if '-' in token and not token.startswith('-') and token not in [relay_server, 'export']:
198
+ for i, token in enumerate(tokens):
199
+ if '-' in token and not token.startswith('-') and token != relay_server:
200
+ if relay_idx >= 0 and (i == relay_idx or i == relay_idx + 1):
201
+ continue # Skip relay server parts
183
202
  secret_code = token
184
203
  break
185
204
 
@@ -80,7 +80,7 @@ git pull originEnc master
80
80
  uv_project_dir = f"""{str(Path.home().joinpath("code/machineconfig"))}"""
81
81
  uv_with = None
82
82
  else:
83
- uv_with = ["machineconfig>=6.99"]
83
+ uv_with = ["machineconfig>=7.32"]
84
84
  uv_project_dir = None
85
85
 
86
86
  import tempfile
@@ -5,7 +5,7 @@
5
5
  # mkdir ~/data/local
6
6
  # sudo mount -o nolock,noatime,nodiratime,proto=tcp,timeo=600,retrans=2,noac alex-p51s-5:/home/alex/data/local ./data/local
7
7
 
8
- uv run --python 3.14 --with "machineconfig>=6.92" python -m machineconfig.scripts.python.mount_nfs
8
+ uv run --python 3.14 --with "machineconfig>=7.32" python -m machineconfig.scripts.python.mount_nfs
9
9
  # Check if remote server is reachable and share folder exists
10
10
  if ! ping -c 1 "$remote_server" &> /dev/null; then
11
11
  echo "💥 Error: Remote server $remote_server is not reachable."
@@ -69,6 +69,7 @@ def get_session_tabs() -> list[tuple[str, str]]:
69
69
  print(result)
70
70
  return result
71
71
 
72
+
72
73
  def start_wt(layout_name: Annotated[str, typer.Argument(help="Layout name to start.")]):
73
74
  from pathlib import Path
74
75
  layouts_file = Path.home().joinpath("dotfiles/machineconfig/layouts.json")
@@ -87,7 +88,6 @@ def start_wt(layout_name: Annotated[str, typer.Argument(help="Layout name to sta
87
88
  raise typer.Exit(code=1)
88
89
  from machineconfig.cluster.sessions_managers.wt_local import run_wt_layout
89
90
  run_wt_layout(layout_config=chosen_layout)
90
-
91
91
  # cmd = f'powershell -ExecutionPolicy Bypass -File "./{layout_name}_layout.ps1"'
92
92
  # from machineconfig.utils.code import exit_then_run_shell_script
93
93
  # exit_then_run_shell_script(cmd, strict=True)
@@ -30,10 +30,11 @@ function wrap_in_shell_script {
30
30
 
31
31
  # Check if the file exists
32
32
  if (Test-Path $env:OP_PROGRAM_PATH) {
33
- Write-Host "Found op program at: $env:OP_PROGRAM_PATH"
33
+ Write-Host "🚀 Taking over from python script @ $env:OP_PROGRAM_PATH"
34
34
  & $env:OP_PROGRAM_PATH
35
+ Write-Host "✅ '$Command' execution completed."
35
36
  } else {
36
- Write-Host "no op program found"
37
+ Write-Host " '$Command' execution completed."
37
38
  }
38
39
 
39
40
  # Clean up the temporary environment variable so it doesn't leak to other processes/sessions
@@ -7,7 +7,7 @@ $user = ''
7
7
  $sharePath = ''
8
8
  $driveLetter = ''
9
9
 
10
- uv run --python 3.14 --with "machineconfig>=6.99" python -m machineconfig.scripts.python.mount_ssh
10
+ uv run --python 3.14 --with "machineconfig>=7.32" python -m machineconfig.scripts.python.mount_ssh
11
11
 
12
12
  net use T: \\sshfs.kr\$user@$host.local
13
13
  # this worked: net use T: \\sshfs\alex@alex-p51s-5.local
@@ -54,7 +54,7 @@ alias ff='wrap_in_shell_script ftpx'
54
54
  alias f='wrap_in_shell_script fire'
55
55
  alias r='wrap_in_shell_script croshell'
56
56
  alias u='wrap_in_shell_script utils'
57
- alias t='wrap_in_shell_script term'
57
+ alias t='wrap_in_shell_script terminal'
58
58
 
59
59
 
60
60
  # alias gcs='gh copilot suggest -t shell'
@@ -1,6 +1,7 @@
1
1
 
2
2
  from pathlib import Path
3
3
 
4
+ INTERACTIVE = Path(__file__).parent.joinpath("web_shortcuts/interactive.sh")
4
5
  APPS = Path(__file__).parent.joinpath("apps.sh")
5
6
  UV = Path(__file__).parent.joinpath("uv.sh")
6
7
 
@@ -2,15 +2,15 @@
2
2
  . <( curl -sSL "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/setup_linux/uv.sh")
3
3
  . <( curl -sSL "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/scripts/linux/mcfgs")
4
4
 
5
- alias devops='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=6.99" devops'
6
- alias cloud='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=6.99" cloud'
7
- alias agents='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=6.99" agents'
8
- alias sessions='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=6.99" sessions'
9
- alias ftpx='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=6.99" ftpx'
10
- alias fire='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=6.99" fire'
11
- alias croshell='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=6.99" croshell'
12
- alias utils='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=6.99" utils'
13
- alias terminal='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=6.99" terminal'
5
+ alias devops='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.32" devops'
6
+ alias cloud='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.32" cloud'
7
+ alias agents='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.32" agents'
8
+ alias sessions='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.32" sessions'
9
+ alias ftpx='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.32" ftpx'
10
+ alias fire='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.32" fire'
11
+ alias croshell='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.32" croshell'
12
+ alias utils='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.32" utils'
13
+ alias terminal='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.32" terminal'
14
14
 
15
15
  alias d='wrap_in_shell_script devops'
16
16
  alias c='wrap_in_shell_script cloud'
@@ -3,15 +3,15 @@
3
3
  iex (iwr "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/setup_windows/uv.ps1").Content
4
4
  iex (iwr "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/scripts/windows/mcfgs.ps1").Content
5
5
 
6
- function devops { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=6.99" devops $args }
7
- function cloud { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=6.99" cloud $args }
8
- function agents { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=6.99" agents $args }
9
- function sessions { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=6.99" sessions $args }
10
- function ftpx { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=6.99" ftpx $args }
11
- function fire { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=6.99" fire $args }
12
- function croshell { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=6.99" croshell $args }
13
- function utils { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=6.99" utils $args }
14
- function terminal { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=6.99" terminal $args }
6
+ function devops { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.32" devops $args }
7
+ function cloud { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.32" cloud $args }
8
+ function agents { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.32" agents $args }
9
+ function sessions { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.32" sessions $args }
10
+ function ftpx { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.32" ftpx $args }
11
+ function fire { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.32" fire $args }
12
+ function croshell { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.32" croshell $args }
13
+ function utils { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.32" utils $args }
14
+ function terminal { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.32" terminal $args }
15
15
 
16
16
  function d { wrap_in_shell_script devops @args }
17
17
  function c { wrap_in_shell_script cloud @args }
@@ -96,7 +96,7 @@ def build_links(target_paths: list[tuple[PLike, str]], repo_root: PLike):
96
96
 
97
97
 
98
98
  def symlink_map(config_file_default_path: PathExtended, self_managed_config_file_path: PathExtended,
99
- on_conflict: Literal["throw-error", "overwriteSelfManaged", "backupSelfManaged", "overwriteDefaultPath", "backupDefaultPath"]
99
+ on_conflict: Literal["throw-error", "overwrite-self-managed", "backup-self-managed", "overwrite-default-path", "backup-default-path"]
100
100
  ) -> OperationResult:
101
101
  """helper function. creates a symlink from `config_file_default_path` to `self_managed_config_file_path`.
102
102
 
@@ -104,10 +104,10 @@ def symlink_map(config_file_default_path: PathExtended, self_managed_config_file
104
104
 
105
105
  on_conflict strategies:
106
106
  - throw-error: Raise exception when files differ
107
- - overwriteSelfManaged: Delete self_managed_config_file_path (self-managed), move config_file_default_path to self_managed_config_file_path, create symlink
108
- - backupSelfManaged: Backup self_managed_config_file_path (self-managed), move config_file_default_path to self_managed_config_file_path, create symlink
109
- - overwriteDefaultPath: Delete config_file_default_path (default path), create symlink to self_managed_config_file_path
110
- - backupDefaultPath: Backup config_file_default_path (default path), create symlink to self_managed_config_file_path
107
+ - overwrite-self-managed: Delete self_managed_config_file_path (self-managed), move config_file_default_path to self_managed_config_file_path, create symlink
108
+ - backup-self-managed: Backup self_managed_config_file_path (self-managed), move config_file_default_path to self_managed_config_file_path, create symlink
109
+ - overwrite-default-path: Delete config_file_default_path (default path), create symlink to self_managed_config_file_path
110
+ - backup-default-path: Backup config_file_default_path (default path), create symlink to self_managed_config_file_path
111
111
 
112
112
  Note: `config_file_default_path` is the default system location, `self_managed_config_file_path` is the self-managed config location
113
113
 
@@ -162,39 +162,41 @@ def symlink_map(config_file_default_path: PathExtended, self_managed_config_file
162
162
  config_file_default_path.delete(sure=True)
163
163
  else:
164
164
  # Files are different, use on_conflict strategy
165
- if on_conflict == "throw-error":
166
- import subprocess
167
- command = f"""delta --side-by-side "{config_file_default_path}" "{self_managed_config_file_path}" """
168
- try:
169
- console.print(Panel(f"🆘 CONFLICT DETECTED | Showing diff between {config_file_default_path} and {self_managed_config_file_path}", title="Conflict Detected", expand=False))
170
- subprocess.run(command, shell=True, check=True)
171
- except Exception:
172
- console.print(Panel("⚠️ Could not show diff using 'delta'. Please install 'delta' for better diff visualization.", title="Delta Not Found", expand=False))
173
- raise RuntimeError(f"Conflict detected: {config_file_default_path} and {self_managed_config_file_path} both exist with different content")
174
- elif on_conflict == "overwriteSelfManaged":
175
- action_taken = "backing_up_target"
176
- details = "Overwriting self-managed config, moving default path to self-managed location"
177
- console.print(Panel(f"📦 OVERWRITE SELF-MANAGED | Deleting {self_managed_config_file_path}, moving {config_file_default_path} to {self_managed_config_file_path}", title="Overwrite Self-Managed", expand=False))
178
- self_managed_config_file_path.delete(sure=True)
179
- config_file_default_path.move(path=self_managed_config_file_path)
180
- elif on_conflict == "backupSelfManaged":
181
- backup_name = f"{self_managed_config_file_path}.orig_{randstr()}"
182
- action_taken = "backing_up_target"
183
- details = f"Backed up self-managed config to {backup_name}"
184
- console.print(Panel(f"📦 BACKUP SELF-MANAGED | Moving {self_managed_config_file_path} to {backup_name}, moving {config_file_default_path} to {self_managed_config_file_path}", title="Backup Self-Managed", expand=False))
185
- self_managed_config_file_path.move(path=backup_name)
186
- config_file_default_path.move(path=self_managed_config_file_path)
187
- elif on_conflict == "overwriteDefaultPath":
188
- action_taken = "backupConfigDefaultPath"
189
- details = "Overwriting default path, creating symlink to self-managed config"
190
- console.print(Panel(f"📦 OVERWRITE DEFAULT | Deleting {config_file_default_path}, creating symlink to {self_managed_config_file_path}", title="Overwrite Default", expand=False))
191
- config_file_default_path.delete(sure=True)
192
- elif on_conflict == "backupDefaultPath":
193
- backup_name = f"{config_file_default_path}.orig_{randstr()}"
194
- action_taken = "backupConfigDefaultPath"
195
- details = f"Backed up default path to {backup_name}"
196
- console.print(Panel(f"📦 BACKUP DEFAULT | Moving {config_file_default_path} to {backup_name}, creating symlink to {self_managed_config_file_path}", title="Backup Default", expand=False))
197
- config_file_default_path.move(path=backup_name)
165
+ import subprocess
166
+ command = f"""delta --side-by-side "{config_file_default_path}" "{self_managed_config_file_path}" """
167
+ try:
168
+ console.print(Panel(f"🆘 CONFLICT DETECTED | Showing diff between {config_file_default_path} and {self_managed_config_file_path}", title="Conflict Detected", expand=False))
169
+ subprocess.run(command, shell=True, check=True)
170
+ except Exception:
171
+ console.print(Panel("⚠️ Could not show diff using 'delta'. Please install 'delta' for better diff visualization.", title="Delta Not Found", expand=False))
172
+
173
+ match on_conflict:
174
+ case "throw-error":
175
+ raise RuntimeError(f"Conflict detected: {config_file_default_path} and {self_managed_config_file_path} both exist with different content")
176
+ case "overwrite-self-managed":
177
+ action_taken = "backing_up_target"
178
+ details = "Overwriting self-managed config, moving default path to self-managed location"
179
+ console.print(Panel(f"📦 OVERWRITE SELF-MANAGED | Deleting {self_managed_config_file_path}, moving {config_file_default_path} to {self_managed_config_file_path}", title="Overwrite Self-Managed", expand=False))
180
+ self_managed_config_file_path.delete(sure=True)
181
+ config_file_default_path.move(path=self_managed_config_file_path)
182
+ case "backup-self-managed":
183
+ backup_name = f"{self_managed_config_file_path}.orig_{randstr()}"
184
+ action_taken = "backing_up_target"
185
+ details = f"Backed up self-managed config to {backup_name}"
186
+ console.print(Panel(f"📦 BACKUP SELF-MANAGED | Moving {self_managed_config_file_path} to {backup_name}, moving {config_file_default_path} to {self_managed_config_file_path}", title="Backup Self-Managed", expand=False))
187
+ self_managed_config_file_path.move(path=backup_name)
188
+ config_file_default_path.move(path=self_managed_config_file_path)
189
+ case "overwrite-default-path":
190
+ action_taken = "backupConfigDefaultPath"
191
+ details = "Overwriting default path, creating symlink to self-managed config"
192
+ console.print(Panel(f"📦 OVERWRITE DEFAULT | Deleting {config_file_default_path}, creating symlink to {self_managed_config_file_path}", title="Overwrite Default", expand=False))
193
+ config_file_default_path.delete(sure=True)
194
+ case "backup-default-path":
195
+ backup_name = f"{config_file_default_path}.orig_{randstr()}"
196
+ action_taken = "backupConfigDefaultPath"
197
+ details = f"Backed up default path to {backup_name}"
198
+ console.print(Panel(f"📦 BACKUP DEFAULT | Moving {config_file_default_path} to {backup_name}, creating symlink to {self_managed_config_file_path}", title="Backup Default", expand=False))
199
+ config_file_default_path.move(path=backup_name)
198
200
  else:
199
201
  # self_managed_config_file_path doesn't exist
200
202
  if config_file_default_path.is_symlink():
@@ -242,7 +244,7 @@ def symlink_map(config_file_default_path: PathExtended, self_managed_config_file
242
244
  return {"action": action_taken, "details": details}
243
245
 
244
246
 
245
- def copy_map(config_file_default_path: PathExtended, self_managed_config_file_path: PathExtended, on_conflict: Literal["throw-error", "overwriteSelfManaged", "backupSelfManaged", "overwriteDefaultPath", "backupDefaultPath"]) -> OperationResult:
247
+ def copy_map(config_file_default_path: PathExtended, self_managed_config_file_path: PathExtended, on_conflict: Literal["throw-error", "overwrite-self-managed", "backup-self-managed", "overwrite-default-path", "backup-default-path"]) -> OperationResult:
246
248
  config_file_default_path = PathExtended(config_file_default_path).expanduser().absolute()
247
249
  self_managed_config_file_path = PathExtended(self_managed_config_file_path).expanduser().absolute()
248
250
 
@@ -289,28 +291,36 @@ def copy_map(config_file_default_path: PathExtended, self_managed_config_file_pa
289
291
  config_file_default_path.delete(sure=True)
290
292
  else:
291
293
  # Files are different, use on_conflict strategy
294
+ import subprocess
295
+ command = f"""delta --side-by-side "{config_file_default_path}" "{self_managed_config_file_path}" """
296
+ try:
297
+ console.print(Panel(f"🆘 CONFLICT DETECTED | Showing diff between {config_file_default_path} and {self_managed_config_file_path}", title="Conflict Detected", expand=False))
298
+ subprocess.run(command, shell=True, check=True)
299
+ except Exception:
300
+ console.print(Panel("⚠️ Could not show diff using 'delta'. Please install 'delta' for better diff visualization.", title="Delta Not Found", expand=False))
301
+
292
302
  match on_conflict:
293
303
  case "throw-error":
294
304
  raise RuntimeError(f"Conflict detected: {config_file_default_path} and {self_managed_config_file_path} both exist with different content")
295
- case "overwriteSelfManaged":
305
+ case "overwrite-self-managed":
296
306
  action_taken = "backing_up_target"
297
307
  details = "Overwriting self-managed config with default path content"
298
308
  console.print(Panel(f"📦 OVERWRITE SELF-MANAGED | Deleting {self_managed_config_file_path}, moving {config_file_default_path} to {self_managed_config_file_path}", title="Overwrite Self-Managed", expand=False))
299
309
  self_managed_config_file_path.delete(sure=True)
300
310
  config_file_default_path.move(path=self_managed_config_file_path)
301
- case "backupSelfManaged":
311
+ case "backup-self-managed":
302
312
  backup_name = f"{self_managed_config_file_path}.orig_{randstr()}"
303
313
  action_taken = "backing_up_target"
304
314
  details = f"Backed up self-managed config to {backup_name}"
305
315
  console.print(Panel(f"📦 BACKUP SELF-MANAGED | Moving {self_managed_config_file_path} to {backup_name}, moving {config_file_default_path} to {self_managed_config_file_path}", title="Backup Self-Managed", expand=False))
306
316
  self_managed_config_file_path.move(path=backup_name)
307
317
  config_file_default_path.move(path=self_managed_config_file_path)
308
- case "overwriteDefaultPath":
318
+ case "overwrite-default-path":
309
319
  action_taken = "backupConfigDefaultPath"
310
320
  details = "Overwriting default path with self-managed config"
311
321
  console.print(Panel(f"📦 OVERWRITE DEFAULT | Deleting {config_file_default_path}, will copy from {self_managed_config_file_path}", title="Overwrite Default", expand=False))
312
322
  config_file_default_path.delete(sure=True)
313
- case "backupDefaultPath":
323
+ case "backup-default-path":
314
324
  backup_name = f"{config_file_default_path}.orig_{randstr()}"
315
325
  action_taken = "backupConfigDefaultPath"
316
326
  details = f"Backed up default path to {backup_name}"
@@ -8,7 +8,7 @@ from machineconfig.utils.terminal import Response
8
8
  from machineconfig.utils.accessories import pprint, randstr
9
9
  from machineconfig.utils.meta import lambda_to_python_script
10
10
  UV_RUN_CMD = "$HOME/.local/bin/uv run" if platform.system() != "Windows" else """& "$env:USERPROFILE/.local/bin/uv" run"""
11
- MACHINECONFIG_VERSION = "machineconfig>=6.99"
11
+ MACHINECONFIG_VERSION = "machineconfig>=7.32"
12
12
  DEFAULT_PICKLE_SUBDIR = "tmp_results/tmp_scripts/ssh"
13
13
 
14
14
  class SSH:
@@ -113,9 +113,11 @@ def upgrade_machine_config_version() -> None:
113
113
  major: int = int(version_parts[0])
114
114
  minor: int = int(version_parts[1])
115
115
 
116
- # Bump minor version by 1
116
+ # Bump minor version by 1, preserving zero-padding
117
117
  new_minor: int = minor + 1
118
- new_version: str = f"{major}.{new_minor}"
118
+ # Preserve the same number of digits as the original minor version
119
+ minor_width: int = len(version_parts[1])
120
+ new_version: str = f"{major}.{new_minor:0{minor_width}d}"
119
121
 
120
122
  old_version_constraint: str = f"machineconfig>={current_version_str}"
121
123
  new_version_constraint: str = f"machineconfig>={new_version}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: machineconfig
3
- Version: 6.99
3
+ Version: 7.32
4
4
  Summary: Dotfiles management package
5
5
  Author-email: Alex Al-Saffar <programmer@usa.com>
6
6
  License: Apache 2.0
@@ -59,15 +59,25 @@ Dotfiles are divided into private and public. Examples of private ones are, `~/.
59
59
  # Install On Windows:
60
60
 
61
61
  ```powershell
62
-
62
+ # Temporary install:
63
63
  iex (iwr bit.ly/cfgwindows).Content
64
+ # Or, if UV is installed:
65
+ iex (uvx machineconfig define)
66
+ # Permanent install:
67
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" # Skip if UV is already installed
68
+ uvx install --upgrade machineconfig
64
69
  ```
65
70
 
66
71
  # Install On Linux and MacOS
67
72
 
68
73
  ```bash
69
-
74
+ # Temporary install:
70
75
  . <(curl -L bit.ly/cfglinux)
76
+ # Or, if UV is installed:
77
+ . <(uvx machineconfig define)
78
+ # Permanent install:
79
+ curl -LsSf https://astral.sh/uv/install.sh | sh # Skip if UV is already installed
80
+ uvx install --upgrade machineconfig
71
81
  ```
72
82
 
73
83
 
@@ -94,8 +94,8 @@ machineconfig/profile/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
94
94
  machineconfig/profile/backup.toml,sha256=Hb25sIdKVvLqOF62NgiOpGZxd45I6IhsNHu623RtfQQ,766
95
95
  machineconfig/profile/bash_shell_profiles.md,sha256=mio0xkMTwO-F3fikWIfgcdQaPCmQrmkxJMNtZsTe9TI,514
96
96
  machineconfig/profile/create_helper.py,sha256=_iNeuwmcEGTx6sf_f40JKHfOCuJRZQRpyE8Fo_3Q6bI,1519
97
- machineconfig/profile/create_links.py,sha256=Zz9gDtL1C33uQdBzXLMPWq8-7_OklyPQ3FQRsueWO-k,14220
98
- machineconfig/profile/create_links_export.py,sha256=n5GKQZGd0YytW_YVuau_SL7CTDWuNEe4O9x1yEsHGv8,3297
97
+ machineconfig/profile/create_links.py,sha256=gdjRWEO4NDSlBWvCPbkBCqegapRB0mKdIsz1z4RJDT0,14228
98
+ machineconfig/profile/create_links_export.py,sha256=BXav-70rme4oagfU8I-xrv_xc6E409ipafegGeIuUDw,3309
99
99
  machineconfig/profile/create_shell_profile.py,sha256=fib3YOj4QMV4dy7ysJtSzner1x-0nGtnGvnTKGyq578,10280
100
100
  machineconfig/profile/mapper.toml,sha256=CGGKi4VbRo1-AuHU7w1g94NbAys0pxn6fI-2l-lUmY0,12469
101
101
  machineconfig/profile/records/generic/shares.toml,sha256=FduDztfyQtZcr5bfx-RSKhEEweweQSWfVXkKWnx8hCY,143
@@ -110,9 +110,8 @@ machineconfig/scripts/linux/fzfag,sha256=x0rX7vM_YjKLZ822D2Xh0HdaTj5kR_gG3g_5_w6
110
110
  machineconfig/scripts/linux/fzffg,sha256=jjeeyFkWmBbwH2taRqC3EOzZep2KR-ZYoI4UI-5kHqg,1090
111
111
  machineconfig/scripts/linux/fzfg,sha256=ClGnJZUsIk4y0qs3W5iXGo-nd0FaqAHMsnh8uoXQFy8,1190
112
112
  machineconfig/scripts/linux/fzfrga,sha256=xSdws6ae28ZXkkqz_uupZ0MYw_vxE2qpLT2DLS3WITM,460
113
- machineconfig/scripts/linux/mcfgs,sha256=DlnOwqCroszbTOM_XtJiz3Hz7po0uV5dQHf5eKcXAhg,1391
113
+ machineconfig/scripts/linux/mcfgs,sha256=R2WmmIVOL9nVtyZdvU02664GD7lYrmQUW4Y8b-wjLM8,1387
114
114
  machineconfig/scripts/linux/skrg,sha256=JgQJGwxaChr148bDnpTB0rrqZMe2o2zGSDA9x_oUhWM,133
115
- machineconfig/scripts/linux/term,sha256=CNPY8p6SitOmtOPKXPervPPabjJNYBerA12SHN_v7w4,1139
116
115
  machineconfig/scripts/linux/other/share_cloud.sh,sha256=lIZrXiaOT11kzu4NFNTXvANhc2bMdSPDYD1-7XUO_C0,2027
117
116
  machineconfig/scripts/linux/other/share_nfs,sha256=LDQZQ9TV7z2y7RtNHiO4Wb513MztyGjaAV-GzTGwUdc,1374
118
117
  machineconfig/scripts/linux/other/start_docker,sha256=_yDN_PPqgzSUnPT7dmniMTpL4IfeeaGy1a2OL3IJlDU,525
@@ -121,6 +120,7 @@ machineconfig/scripts/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
121
120
  machineconfig/scripts/python/agents.py,sha256=aVbLQDgpngXZm4taHcED4sAxyHvV2_Dz5VW3apPcQcY,10651
122
121
  machineconfig/scripts/python/cloud.py,sha256=yAD6ciKiEtv2CH3g2NScDK5cpCZQi7Vu8yyeehw_cU8,1263
123
122
  machineconfig/scripts/python/croshell.py,sha256=QyQbVboNqDQHJkUeSsJvdT212t4TW46yat3GBzneqsQ,8649
123
+ machineconfig/scripts/python/define.py,sha256=vk7E5twa3DtK10ZxRVlbklYHzcou7M3zPAoV5z9_JGI,645
124
124
  machineconfig/scripts/python/devops.py,sha256=Lv4d-UlyOREj4VTcu_pxswYo54Mawe3XGeKjreGQDYg,2222
125
125
  machineconfig/scripts/python/devops_navigator.py,sha256=5Cm384D4S8_GsvMzTwr0C16D0ktf8_5Mk5bEJncwDO8,237
126
126
  machineconfig/scripts/python/fire_jobs.py,sha256=-xrUlBQ90asQkXuWESiDsD6D05Xuw0-NMmfwBerwSjg,13874
@@ -128,7 +128,7 @@ machineconfig/scripts/python/ftpx.py,sha256=A13hL_tDYfcsaK9PkshK-0lrUS6KPhPCtwqW
128
128
  machineconfig/scripts/python/interactive.py,sha256=jFHpiQq_lisa51BS4-qUlWPJ1-pmHmPAfA6dixdsOzY,11745
129
129
  machineconfig/scripts/python/mcfg.py,sha256=TB5lZDZDImGqX4_mMSEv4ZoFigIPA0RXn-9H2cmPS6g,2457
130
130
  machineconfig/scripts/python/sessions.py,sha256=Q_fbprawvW1x_E6jKQ-Z2Z5MRurRaepKUvi5z1G4CUw,9531
131
- machineconfig/scripts/python/terminal.py,sha256=5D0RlZkx9ut5WlwjDI8j-t_z6u-H_jJD1eKBnWy_TGU,5191
131
+ machineconfig/scripts/python/terminal.py,sha256=RY7hJ0JIefJeGe_sp7ZiZpOG_vhXLmEAFRq-Fon-VEY,5191
132
132
  machineconfig/scripts/python/utils.py,sha256=9vwF5QRbHphNF154UYg6Ld3W0b3N9uEkfMEeR-nP_sg,2802
133
133
  machineconfig/scripts/python/ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
134
  machineconfig/scripts/python/ai/generate_files.py,sha256=VfjKdwgF8O6E4oiRtfWNliibLmmwGe7f9ld6wpOsXTw,14498
@@ -162,7 +162,7 @@ machineconfig/scripts/python/ai/solutions/opencode/opencode.json,sha256=nahHKRw1
162
162
  machineconfig/scripts/python/ai/solutions/opencode/opencode.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
163
163
  machineconfig/scripts/python/env_manager/__init__.py,sha256=E4LAHbU1wo2dLjE36ntv8U7QNTe8TasujUAYK9SLvWk,6
164
164
  machineconfig/scripts/python/env_manager/path_manager_backend.py,sha256=ZVGlGJALhg7zNABDdwXxL7MFbL2BXPebObipXSLGbic,1552
165
- machineconfig/scripts/python/env_manager/path_manager_tui.py,sha256=xCfevrfzL4rLjWeGhWgykBxCGK-zS_7SxeD8whp7m1M,6932
165
+ machineconfig/scripts/python/env_manager/path_manager_tui.py,sha256=uzbNgu5m9itV87-WXfI4cR2yCuT_70mlfpt59L2zL3U,6932
166
166
  machineconfig/scripts/python/helpers_agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
167
  machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py,sha256=YD6-rtudHNip8tx85amSmOZZIHBP9khq4az3dF41j6U,5934
168
168
  machineconfig/scripts/python/helpers_agents/fire_agents_help_search.py,sha256=qIfSS_su2YJ1Gb0_lu4cbjlJlYMBw0v52NTGiSrGjk8,2991
@@ -192,13 +192,13 @@ machineconfig/scripts/python/helpers_croshell/start_slidev.py,sha256=HfJReOusTPh
192
192
  machineconfig/scripts/python/helpers_croshell/viewer.py,sha256=heQNjB9fwn3xxbPgMofhv1Lp6Vtkl76YjjexWWBM0pM,2041
193
193
  machineconfig/scripts/python/helpers_croshell/viewer_template.py,sha256=ve3Q1-iKhCLc0VJijKvAeOYp2xaFOeIOC_XW956GWCc,3944
194
194
  machineconfig/scripts/python/helpers_devops/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
195
- machineconfig/scripts/python/helpers_devops/cli_config.py,sha256=zpe2jMoDHjjkOGR9rc6mE_g_ve-02qvBypVao9-QBQc,7222
196
- machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py,sha256=dduLPmaxOU9eOOy76QTG8Yzi5WQdewbiJ8X615Z19wk,2487
195
+ machineconfig/scripts/python/helpers_devops/cli_config.py,sha256=kWgtoTPejj5lNk2FD2E1scgqloaxUq00_7oFuDSH0AI,6891
196
+ machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py,sha256=pVUFE1SUtyTiulLzUssf8FrtU190EIV-l9rpwucsBa0,3427
197
197
  machineconfig/scripts/python/helpers_devops/cli_data.py,sha256=79Xvx7YnbueruEnl69hrDg2AhVxf_zCUdlVcKfeMGyQ,1774
198
198
  machineconfig/scripts/python/helpers_devops/cli_nw.py,sha256=9NcVJvPYaUDtmI_DSKthZxR4emMBeNWVM_M5f0YR8EQ,7302
199
199
  machineconfig/scripts/python/helpers_devops/cli_repos.py,sha256=Xwkv1adqHZvTfRSPWiqSK3PZ1XADyx3llw_YkbxaKyE,12505
200
- machineconfig/scripts/python/helpers_devops/cli_self.py,sha256=QV7URlqzl1c1SW0dD0zWuDFdwfegEbpCBseNxMDZRq0,6621
201
- machineconfig/scripts/python/helpers_devops/cli_share_server.py,sha256=qNGpLYWEYsgILqogd7yrXG5Rz3R25AOsXeAUc7fdBEo,10222
200
+ machineconfig/scripts/python/helpers_devops/cli_self.py,sha256=FDB8YjLYYj1qZkCeeAMVc7jnGy4fPVzRzqUxlvZa4DU,6621
201
+ machineconfig/scripts/python/helpers_devops/cli_share_server.py,sha256=BJnm9mEI0PGA2xK_ciNX1docIiRQ_fNhygGrDCcTekw,11076
202
202
  machineconfig/scripts/python/helpers_devops/cli_terminal.py,sha256=k_PzXaiGyE0vXr0Ii1XcJz2A7UvyPJrR31TRWt4RKRI,6019
203
203
  machineconfig/scripts/python/helpers_devops/cli_utils.py,sha256=B9pnosujOxZLpwzJO4YAqeO-2rvvOFIZgrUwGREZXfM,11118
204
204
  machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py,sha256=Dn8luB6QJzxKiiFSC-NMqiYddWZoca3A8eOjMYZDzTc,5598
@@ -225,7 +225,7 @@ machineconfig/scripts/python/helpers_navigator/search_bar.py,sha256=kDi8Jhxap8wd
225
225
  machineconfig/scripts/python/helpers_repos/action.py,sha256=8je051kpGZ7A_GRsQyWKhPZ8xVW7tSm4bnPu6VjxaXk,9755
226
226
  machineconfig/scripts/python/helpers_repos/action_helper.py,sha256=XRCtkGkNrxauqUd9qkxtfJt02Mx2gejSYDLL0jyWn24,6176
227
227
  machineconfig/scripts/python/helpers_repos/clone.py,sha256=UULEG5xJuXlPGU0nqXH6U45jA9DOFqLw8B4iPytCwOQ,5471
228
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py,sha256=a2AfMjqAHwBr2gI83VG7SU2hys8VAZE1dwmlp9_PJ60,10450
228
+ machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py,sha256=3iub-GApBNiOaPLfcOxB9RVF_RPCLWKZ7A8w3CtrFcA,10450
229
229
  machineconfig/scripts/python/helpers_repos/count_lines.py,sha256=Q5c7b-DxvTlQmljoic7niTuiAVyFlwYvkVQ7uRJHiTo,16009
230
230
  machineconfig/scripts/python/helpers_repos/count_lines_frontend.py,sha256=vSDtrF4829jziwp6WZmGt9G8MJ9jY4hfXqtf0vhkYSE,607
231
231
  machineconfig/scripts/python/helpers_repos/entrypoint.py,sha256=WYEFGUJp9HWImlFjbs_hiFZrUqM_KEYm5VvSUjWd04I,2810
@@ -241,7 +241,7 @@ machineconfig/scripts/python/nw/add_ssh_key.py,sha256=9JLmWu8pE7PAL5VuCFd19iVEdC
241
241
  machineconfig/scripts/python/nw/devops_add_identity.py,sha256=aPjcHbTLhxYwWYcandyAHdwuO15ZBu3fB82u6bI0tMQ,3773
242
242
  machineconfig/scripts/python/nw/devops_add_ssh_key.py,sha256=CkIl85hZLtG9k7yXLSzqi88YrilHV4hIUWHAPBwxWjw,8922
243
243
  machineconfig/scripts/python/nw/mount_drive,sha256=zemKofv7hOmRN_V3qK0q580GkfWw3VdikyVVQyiu8j8,3514
244
- machineconfig/scripts/python/nw/mount_nfs,sha256=x5_rKgP2Kza6LHCHFJqE0Ej___aUXHs-AwzcIlhYY-g,1855
244
+ machineconfig/scripts/python/nw/mount_nfs,sha256=Dri4hGiM2GxpqqxpdBPbf7dRHrr7P1HzZy6xtrHYQfU,1855
245
245
  machineconfig/scripts/python/nw/mount_nfs.py,sha256=lOMDY4RS7tx8gsCazVR5tNNwFbaRyO2PJlnwBCDQgCM,3573
246
246
  machineconfig/scripts/python/nw/mount_nw_drive,sha256=BqjGBCbwe5ZAsZDO3L0zHhh_gJfZy1CYOcqXA4Y-WkQ,2262
247
247
  machineconfig/scripts/python/nw/mount_nw_drive.py,sha256=iru6AtnTyvyuk6WxlK5R4lDkuliVpPV5_uBTVVhXtjQ,1550
@@ -255,12 +255,11 @@ machineconfig/scripts/python/nw/wsl_windows_transfer.py,sha256=jHJyFTuks_Kw4cgE8
255
255
  machineconfig/scripts/windows/fzfb.ps1,sha256=Bmngm2aY8hnPa3iKAOK6EPDYdKzGLUc81wYOnJhNoqg,149
256
256
  machineconfig/scripts/windows/fzfg.ps1,sha256=CHJbMrMuZePd4dxwIwz3g4XWAEmWmckuX-Nrx2xgRkg,27
257
257
  machineconfig/scripts/windows/fzfrga.bat,sha256=rU_KBMO6ii2EZ0akMnmDk9vpuhKSUZqkV0o8a8ywXcM,488
258
- machineconfig/scripts/windows/mcfgs.ps1,sha256=Ag-r5klgkRxeCI1AN3vlgmwriHvC_g7XSuDt0YnH5-w,1778
259
- machineconfig/scripts/windows/term.ps1,sha256=nme_OWis84qN-zI2c0rdysNcDIdoaEKajXZhP2QioQs,1742
258
+ machineconfig/scripts/windows/mcfgs.ps1,sha256=1mLCFDPBG-1uNVaZe3fIAgvS_uo3u55TQaysG6Wj9Sw,1868
260
259
  machineconfig/scripts/windows/mounts/mount_nfs.ps1,sha256=XrAdzpxE6a4OccSmWJ7YWHJTnsZK8uXnFE5j9GOPA20,2026
261
260
  machineconfig/scripts/windows/mounts/mount_nw.ps1,sha256=puxcfZc3ZCJerm8pj8OZGVoTYkhzp-h7oV-MrksSqIE,454
262
261
  machineconfig/scripts/windows/mounts/mount_smb.ps1,sha256=PzYWpIO9BpwXjdWlUQL9pnMRnOGNSkxfh4bHukJFme8,69
263
- machineconfig/scripts/windows/mounts/mount_ssh.ps1,sha256=24Zp11dG4_l35-bVuc3hbgh88J5bbuw08y5oQrs3sCs,322
262
+ machineconfig/scripts/windows/mounts/mount_ssh.ps1,sha256=lO0zd1Qyu_nC43TOzfCcfu4rPmMYZlluFKZWYzb2GnY,322
264
263
  machineconfig/scripts/windows/mounts/share_cloud.cmd,sha256=exD7JCdxw2LqVjw2MKCYHbVZlEqmelXtwnATng-dhJ4,1028
265
264
  machineconfig/scripts/windows/mounts/share_smb.ps1,sha256=U7x8ULYSjbgzTtiHNSKQuTaZ_apilDvkGV5Xm5hXk5M,384
266
265
  machineconfig/scripts/windows/mounts/unlock_bitlocker.ps1,sha256=Wv-SLscdckV-1mG3p82VXKPY9zW3hgkRmcLUXIZ1daE,253
@@ -332,7 +331,7 @@ machineconfig/settings/rofi/config.rasi,sha256=nDX5B8wdXQYF1fwiOTBRJUI4l_gQbYaLa
332
331
  machineconfig/settings/rofi/config_default.rasi,sha256=rTfKnC-bZuWX1l-lWQACCUOE1ShhkfykAxtXX9PlQHE,4694
333
332
  machineconfig/settings/shells/alacritty/alacritty.toml,sha256=EbL-2Y4QunW1pvRWB2yuLCw8MMPONheJr5LFoWRieUQ,871
334
333
  machineconfig/settings/shells/alacritty/alacritty.yml,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
335
- machineconfig/settings/shells/bash/init.sh,sha256=BBIeIkhBp7IJHU5_KcUBCTilqjmmC6ZWYqNSHIs_ABA,2927
334
+ machineconfig/settings/shells/bash/init.sh,sha256=EoZemahn3ewLsxUWv1RD1XLq-WZNNVE8yIhIu7ENDZs,2931
336
335
  machineconfig/settings/shells/hyper/.hyper.js,sha256=h-HqeYlvPvPD4Ee7828Cxo87uVkzbMGJFqXTZIWoegw,8884
337
336
  machineconfig/settings/shells/ipy/profiles/default/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
338
337
  machineconfig/settings/shells/ipy/profiles/default/startup/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -368,7 +367,7 @@ machineconfig/settings/zellij/layouts/panes.kdl,sha256=KlhKtelBy4Z2ENV_pix4xE7NH
368
367
  machineconfig/settings/zellij/layouts/st.kdl,sha256=QXLRK7Wx05aKbKRHVmm4RspLYzPmEa44JMK1TwXQk58,523
369
368
  machineconfig/settings/zellij/layouts/st2.kdl,sha256=1FKTH3qQWYMWp_wPMreP7fKOTlVd4cfBy3J8fv4zCBc,1489
370
369
  machineconfig/settings/zellij/layouts/stacked_panes.kdl,sha256=usY8kKKwX1KUMXnWDivPg0i0drpM1Biw-tOnNZVjiZU,163
371
- machineconfig/setup_linux/__init__.py,sha256=7VLvb9uj9XJYtlYu9lgavQuxjX3tVCE9i8WdOjB3Qa4,314
370
+ machineconfig/setup_linux/__init__.py,sha256=5gT_vc6ze_RUMx9mk7_9kkOTyPPTo3MJFh2fq8MGToU,391
372
371
  machineconfig/setup_linux/apps.sh,sha256=XOEzhuwYNat83ybamUdnVhDaGf2wlQiT5wVNvz2aJYM,3262
373
372
  machineconfig/setup_linux/apps_desktop.sh,sha256=L2b_pcw3GiQdoAaoMO7J4bVvUoG5Pnuy9kDhV8JqprU,3325
374
373
  machineconfig/setup_linux/apps_gui.sh,sha256=lFPYq7H2bRogPwW6QoEuSr9GnTjHS-jRM_eYg2rjOmM,2301
@@ -378,7 +377,7 @@ machineconfig/setup_linux/others/cli_installation.sh,sha256=gVvszYZJgKPRJx2SEaE3
378
377
  machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh,sha256=F5dbg0n9RHsKGPn8fIdZMn3p0RrHEkb8rWBGsdVGbus,1207
379
378
  machineconfig/setup_linux/ssh/openssh_all.sh,sha256=3dg6HEUFbHQOzLfSAtzK_D_GB8rGCCp_aBnxNdnidVc,824
380
379
  machineconfig/setup_linux/ssh/openssh_wsl.sh,sha256=1eeRGrloVB34K5z8yWVUMG5b9pV-WBfHgV9jqXiYgCQ,1398
381
- machineconfig/setup_linux/web_shortcuts/interactive.sh,sha256=moKocCzB0Oik4YvQcQs6lt5mN7f4bUnNsO-VBRguMXA,1449
380
+ machineconfig/setup_linux/web_shortcuts/interactive.sh,sha256=c1aV0EhTTDU8YTG1XKkiRN8cAYG8WKFJVn6CEGydQ6s,1449
382
381
  machineconfig/setup_mac/__init__.py,sha256=Q1waupi5vCBroLqc8Rtnw69_7jLnm2Cs7_zH_GSZgMs,616
383
382
  machineconfig/setup_mac/apps.sh,sha256=R0N6fBwLCzwy4qAormyMerXXXrHazibSkY6NrNOpTQU,2772
384
383
  machineconfig/setup_mac/apps_gui.sh,sha256=3alvddg918oMlJB2aUWJWpGGoaq5atlxcaOwhnyXlRI,9517
@@ -393,7 +392,7 @@ machineconfig/setup_windows/others/power_options.ps1,sha256=c7Hn94jBD5GWF29CxMhm
393
392
  machineconfig/setup_windows/ssh/add-sshkey.ps1,sha256=qfPdqCpd9KP3VhH4ifsUm1Xvec7c0QVl4Wt8JIAm9HQ,1653
394
393
  machineconfig/setup_windows/ssh/add_identity.ps1,sha256=b8ZXpmNUSw3IMYvqSY7ClpdWPG39FS7MefoWnRhWN2U,506
395
394
  machineconfig/setup_windows/ssh/openssh-server.ps1,sha256=OMlYQdvuJQNxF5EILLPizB6BZAT3jAmDsv1WcVVxpFQ,2529
396
- machineconfig/setup_windows/web_shortcuts/interactive.ps1,sha256=-hZQv00ogDbe4jNz17J09PmfOv0zGju0gS35XAD0-yQ,1751
395
+ machineconfig/setup_windows/web_shortcuts/interactive.ps1,sha256=WXWrFz-Ws9QpFkNPHa_hCt8f91Xzm94yzYyzIJwzvf0,1751
397
396
  machineconfig/setup_windows/wt_and_pwsh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
398
397
  machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py,sha256=ogxJnwpdcpH7N6dFJu95UCNoGYirZKQho_3X0F_hmXs,6791
399
398
  machineconfig/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -401,7 +400,7 @@ machineconfig/utils/accessories.py,sha256=Rs8R0GUb2Ub6YimkgXHnI02CShS5BKlrZdCigV
401
400
  machineconfig/utils/code.py,sha256=fVeQnhZE8-aoPBsrgjNcBTcv3NuyBSSQv9P8jyC8W_M,6635
402
401
  machineconfig/utils/installer.py,sha256=1ScBaTe_pRsfTYht9-LXmirgnNizNy8u1GgetUfEDO4,10351
403
402
  machineconfig/utils/io.py,sha256=4dSieoqZO8Vvi4vW8lLoITDHBvmFp4dtl3kyeZHQ6Co,2528
404
- machineconfig/utils/links.py,sha256=ffc8fwbQ1TVdXYn2J1rq7gCZHidxwCzlSppdyrzq4LA,24382
403
+ machineconfig/utils/links.py,sha256=mA98WNkX5iK4c6f8Ht3HKv7sB6VjIwqukTxXY23PVjk,25143
405
404
  machineconfig/utils/meta.py,sha256=4ocYH3Zi6bVN6FVgXoGIfoasV6oxi67I9rQ8hvyYinc,9892
406
405
  machineconfig/utils/notifications.py,sha256=tuXIudcip0tEioG-bm8BbLr3FMDve4f6BktlznBhKxM,9013
407
406
  machineconfig/utils/options.py,sha256=VWYx3EKJxIp-CJ8gDGYdjclKSc1tMUhyrC8v3seeneo,7447
@@ -411,10 +410,10 @@ machineconfig/utils/procs.py,sha256=YPA_vEYQGwPd_o_Lc6nOTBo5BrB1tSs8PJ42XiGpenM,
411
410
  machineconfig/utils/scheduler.py,sha256=fguwvINyaupOxdU5Uadyxalh_jXTXDzt0ioEgjEOKcM,14705
412
411
  machineconfig/utils/scheduling.py,sha256=vcJgajeJPSWkJNlarYJSmLvasdOuCtBM4druOAB1Nwc,11089
413
412
  machineconfig/utils/source_of_truth.py,sha256=ZAnCRltiM07ig--P6g9_6nEAvNFC4X4ERFTVcvpIYsE,764
414
- machineconfig/utils/ssh.py,sha256=6LHTYA4OB5GtsmTjQ8Rut0S6JUqZgm7Vx_Rm2s1G98s,39008
413
+ machineconfig/utils/ssh.py,sha256=xrMpTa4WFQG6QgaE00uJQZYq0RPaDWvx28Ke6YogYZo,39008
415
414
  machineconfig/utils/terminal.py,sha256=VDgsjTjBmMGgZN0YIc0pJ8YksLDrBtiXON1EThy7_is,4264
416
415
  machineconfig/utils/tst.py,sha256=6u1GI49NdcpxH2BYGAusNfY5q9G_ytCGVzFM5b6HYpM,674
417
- machineconfig/utils/upgrade_packages.py,sha256=i7K2bpmwdmag833t1ZmYvF45rO8GMkmJvLP3C1AyNEI,5694
416
+ machineconfig/utils/upgrade_packages.py,sha256=75kabcI-chMiaBnafJ_hdhDUz_GyH7AsDt7rW3hyu9M,5851
418
417
  machineconfig/utils/ve.py,sha256=L-6PBXnQGXThiwWgheJMQoisAZOZA6SVCbGw2J-GFnI,2414
419
418
  machineconfig/utils/ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
420
419
  machineconfig/utils/cloud/onedrive/README.md,sha256=i20oRG110AN0yLF3DARHfWXDJjPBiSgWI8CP2HQAqrk,3774
@@ -440,8 +439,8 @@ machineconfig/utils/schemas/installer/installer_types.py,sha256=QClRY61QaduBPJoS
440
439
  machineconfig/utils/schemas/layouts/layout_types.py,sha256=TcqlZdGVoH8htG5fHn1KWXhRdPueAcoyApppZsPAPto,2020
441
440
  machineconfig/utils/schemas/repos/repos_types.py,sha256=ECVr-3IVIo8yjmYmVXX2mnDDN1SLSwvQIhx4KDDQHBQ,405
442
441
  machineconfig/utils/ssh_utils/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
443
- machineconfig-6.99.dist-info/METADATA,sha256=2Ppib9vQOH-rp58VBEOvgD7ySG2w8vC8YuSELbUrC-4,2928
444
- machineconfig-6.99.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
445
- machineconfig-6.99.dist-info/entry_points.txt,sha256=uf_ZPJa02_y3Fw5Z7m22cq7PwxhYd1QV2FfPNZTl_dQ,519
446
- machineconfig-6.99.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
447
- machineconfig-6.99.dist-info/RECORD,,
442
+ machineconfig-7.32.dist-info/METADATA,sha256=Cr6xNtBnHDG4jLnsqC1QAje0Wn1LR5pm5gih8-c5ZhI,3396
443
+ machineconfig-7.32.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
444
+ machineconfig-7.32.dist-info/entry_points.txt,sha256=0ho96z7b1toS6CeiajpTwEwQa83UrJ3g1onD4Wxax9o,624
445
+ machineconfig-7.32.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
446
+ machineconfig-7.32.dist-info/RECORD,,
@@ -2,9 +2,11 @@
2
2
  agents = machineconfig.scripts.python.agents:main
3
3
  cloud = machineconfig.scripts.python.cloud:main
4
4
  croshell = machineconfig.scripts.python.croshell:main
5
+ define = machineconfig.scripts.python.define:main
5
6
  devops = machineconfig.scripts.python.devops:main
6
7
  fire = machineconfig.scripts.python.fire_jobs:main
7
8
  ftpx = machineconfig.scripts.python.ftpx:main
9
+ machineconfig = machineconfig.scripts.python.mcfg:main
8
10
  mcfg = machineconfig.scripts.python.mcfg:main
9
11
  sessions = machineconfig.scripts.python.sessions:main
10
12
  terminal = machineconfig.scripts.python.terminal:main
@@ -1,39 +0,0 @@
1
-
2
- #!/usr/bin/env bash
3
- set -euo pipefail
4
-
5
- RANDOM_NAME=$(date +%s%N | sha256sum | head -c 16)
6
- OP_DIR="$HOME/tmp_results/tmp_scripts/machineconfig"
7
- OP_PROGRAM_PATH="$OP_DIR/${RANDOM_NAME}.sh"
8
- export OP_PROGRAM_PATH
9
-
10
- # ANSI color/style codes
11
- BOLD="\033[1m"
12
- RESET="\033[0m"
13
- GREEN="\033[32m"
14
- YELLOW="\033[33m"
15
- BLUE="\033[34m"
16
- RED="\033[31m"
17
-
18
- timestamp=$(date -u +"%Y-%m-%d %H:%M:%SZ")
19
-
20
- printf "%b\n" "${BOLD}${BLUE}🛠️ terminal — running term${RESET}"
21
- printf "%b\n" "${BLUE}Timestamp:${RESET} ${timestamp}"
22
- printf "%b\n" "${BLUE}Op program path:${RESET} ${OP_PROGRAM_PATH}"
23
-
24
- terminal "$@"
25
-
26
- if [[ -f "$OP_PROGRAM_PATH" ]]; then
27
- printf "%b\n" "${GREEN}✅ Found op program:${RESET} ${OP_PROGRAM_PATH}"
28
- bat --style=plain --paging=never "$OP_PROGRAM_PATH"
29
- printf "%b\n" "${GREEN}▶ Running...${RESET}"
30
- . "$OP_PROGRAM_PATH"
31
- status=$?
32
- if [[ $status -eq 0 ]]; then
33
- printf "%b\n" "${GREEN}✅ Completed successfully (exit ${status})${RESET}"
34
- else
35
- printf "%b\n" "${YELLOW}⚠️ Program exited with status ${status}${RESET}"
36
- fi
37
- else
38
- printf "%b\n" "${YELLOW}⚠️ No op program found at: ${OP_PROGRAM_PATH}${RESET}"
39
- fi
@@ -1,48 +0,0 @@
1
- # Equivalent PowerShell script for term.ps1
2
-
3
- Set-StrictMode -Version Latest
4
- $ErrorActionPreference = 'Stop'
5
-
6
- # Generate random name using timestamp and SHA256 hash
7
- $timestampNs = [DateTimeOffset]::Now.ToUnixTimeMilliseconds() * 1000000
8
- $hashInput = [System.Text.Encoding]::UTF8.GetBytes($timestampNs.ToString())
9
- $sha256 = [System.Security.Cryptography.SHA256]::Create()
10
- $hashBytes = $sha256.ComputeHash($hashInput)
11
- $hashString = -join ($hashBytes | ForEach-Object { $_.ToString('x2') })
12
- $randomName = $hashString.Substring(0, 16)
13
-
14
- $opDir = "$env:USERPROFILE\tmp_results\tmp_scripts\machineconfig"
15
- $opProgramPath = "$opDir\$randomName.ps1"
16
- $global:OP_PROGRAM_PATH = $opProgramPath
17
-
18
- # ANSI color/style codes (using Write-Host colors)
19
- $bold = [char]27 + '[1m'
20
- $reset = [char]27 + '[0m'
21
- $green = [char]27 + '[32m'
22
- $yellow = [char]27 + '[33m'
23
- $blue = [char]27 + '[34m'
24
- $red = [char]27 + '[31m'
25
-
26
- $timestamp = Get-Date -Format 'u'
27
-
28
- Write-Host "${bold}${blue}🛠️ terminal — running term${reset}"
29
- Write-Host "${blue}Timestamp:${reset} ${timestamp}"
30
- Write-Host "${blue}Op program path:${reset} ${opProgramPath}"
31
-
32
- terminal $args
33
-
34
- if (Test-Path $opProgramPath) {
35
- Write-Host "${green}✅ Found op program:${reset} ${opProgramPath}"
36
- # Assuming bat is available; otherwise, use Get-Content
37
- & bat --style=plain --paging=never $opProgramPath
38
- Write-Host "${green}▶ Running...${reset}"
39
- . $opProgramPath
40
- $status = $LASTEXITCODE
41
- if ($status -eq 0) {
42
- Write-Host "${green}✅ Completed successfully (exit ${status})${reset}"
43
- } else {
44
- Write-Host "${yellow}⚠️ Program exited with status ${status}${reset}"
45
- }
46
- } else {
47
- Write-Host "${yellow}⚠️ No op program found at: ${opProgramPath}${reset}"
48
- }