machineconfig 5.76__py3-none-any.whl → 5.77__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.

@@ -22,16 +22,20 @@ def get_app():
22
22
  _ = install
23
23
  app.command("install", no_args_is_help=True, help="🛠️ [i] Install essential packages")(install)
24
24
  app.command("i", no_args_is_help=True, help="Install essential packages", hidden=True)(install)
25
- app.add_typer(cli_repos.get_app(), name="repos")
26
- app.add_typer(cli_repos.get_app(), name="r", hidden=True)
27
- app.add_typer(cli_config.get_app(), name="config")
28
- app.add_typer(cli_config.get_app(), name="c", hidden=True)
25
+ app_repos = cli_repos.get_app()
26
+ app.add_typer(app_repos, name="repos")
27
+ app.add_typer(app_repos, name="r", hidden=True)
28
+ app_config = cli_config.get_app()
29
+ app.add_typer(app_config, name="config")
30
+ app.add_typer(app_config, name="c", hidden=True)
29
31
  app.add_typer(cli_data.app_data, name="data")
30
32
  app.add_typer(cli_data.app_data, name="d", hidden=True)
31
- app.add_typer(cli_self.get_app(), name="self")
32
- app.add_typer(cli_self.get_app(), name="s", hidden=True)
33
- app.add_typer(cli_network.get_app(), name="network")
34
- app.add_typer(cli_network.get_app(), name="n", hidden=True)
33
+ app_self = cli_self.get_app()
34
+ app.add_typer(app_self, name="self")
35
+ app.add_typer(app_self, name="s", hidden=True)
36
+ app_nw = cli_network.get_app()
37
+ app.add_typer(app_nw, name="network")
38
+ app.add_typer(app_nw, name="n", hidden=True)
35
39
  return app
36
40
 
37
41
  def main():
@@ -31,6 +31,17 @@ def add_ssh_identity():
31
31
  import machineconfig.scripts.python.devops_helpers.devops_add_identity as helper
32
32
  helper.main()
33
33
 
34
+
35
+ def show_address():
36
+ import socket
37
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
38
+ s.connect(('8.8.8.8',80))
39
+ local_ip_v4 = s.getsockname()[0]
40
+ s.close()
41
+ print(f"This computer is @ {local_ip_v4}")
42
+
43
+
44
+
34
45
  def get_app():
35
46
  nw_apps = typer.Typer(help="🔐 [n] Network subcommands", no_args_is_help=True)
36
47
  nw_apps.command(name="share-terminal", help="📡 [t] Share terminal via web browser")(cli_terminal.main)
@@ -43,4 +54,6 @@ def get_app():
43
54
  nw_apps.command(name="k", help="Add SSH public key to this machine", hidden=True)(add_ssh_key)
44
55
  nw_apps.command(name="add-ssh-identity", help="🗝️ [a] Add SSH identity (private key) to this machine")(add_ssh_identity)
45
56
  nw_apps.command(name="a", help="Add SSH identity (private key) to this machine", hidden=True)(add_ssh_identity)
57
+ nw_apps.command(name="show-address", help="[A] Show this computer addresses on network")(show_address)
58
+ nw_apps.command(name="a", help="Show this computer addresses on network", hidden=True)(show_address)
46
59
  return nw_apps
@@ -53,6 +53,25 @@ def run_python(ip: str = typer.Argument(..., help="Python command to run in the
53
53
  import subprocess
54
54
  import sys
55
55
  subprocess.run([sys.executable, ip], cwd=machineconfig.__path__[0])
56
+ def readme():
57
+ from rich.console import Console
58
+ from rich.markdown import Markdown
59
+ import requests
60
+
61
+ # URL of the raw README.md file
62
+ url_readme = "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/README.md"
63
+
64
+ # Fetch the content
65
+ response = requests.get(url_readme)
66
+ response.raise_for_status() # Raise an error for bad responses
67
+
68
+ # Parse markdown
69
+ md = Markdown(response.text)
70
+
71
+ # Render in terminal
72
+ console = Console()
73
+ console.print(md)
74
+
56
75
 
57
76
  def get_app():
58
77
  cli_app = typer.Typer(help="🔄 [s] self operations subcommands", no_args_is_help=True)
@@ -68,4 +87,6 @@ def get_app():
68
87
  cli_app.command("n", no_args_is_help=False, help="NAVIGATE command structure with TUI", hidden=True)(navigate)
69
88
  cli_app.command("python", no_args_is_help=False, help="🐍 [c] python command/file in the machineconfig environment")(run_python)
70
89
  cli_app.command("c", no_args_is_help=False, help="RUN python command/file in the machineconfig environment", hidden=True)(run_python)
90
+ cli_app.command("readme", no_args_is_help=False, help="📚 [r] render readme markdown in terminal.")(readme)
91
+ cli_app.command("r", no_args_is_help=False, hidden=True)(readme)
71
92
  return cli_app
@@ -0,0 +1,148 @@
1
+ """SSH"""
2
+
3
+ from platform import system
4
+ from machineconfig.utils.source_of_truth import LIBRARY_ROOT
5
+ from machineconfig.utils.path_extended import PathExtended
6
+ from rich.console import Console
7
+ from rich.panel import Panel
8
+ from rich import box # Import box
9
+ from typing import Optional
10
+ import typer
11
+
12
+
13
+ console = Console()
14
+
15
+
16
+ def get_add_ssh_key_script(path_to_key: PathExtended):
17
+ console.print(Panel("🔑 SSH KEY CONFIGURATION", title="[bold blue]SSH Setup[/bold blue]"))
18
+ if system() == "Linux" or system() == "Darwin":
19
+ authorized_keys = PathExtended.home().joinpath(".ssh/authorized_keys")
20
+ console.print(Panel(f"🐧 Linux SSH configuration\n📄 Authorized keys file: {authorized_keys}", title="[bold blue]System Info[/bold blue]"))
21
+ elif system() == "Windows":
22
+ authorized_keys = PathExtended("C:/ProgramData/ssh/administrators_authorized_keys")
23
+ console.print(Panel(f"🪟 Windows SSH configuration\n📄 Authorized keys file: {authorized_keys}", title="[bold blue]System Info[/bold blue]"))
24
+ else:
25
+ console.print(Panel("❌ ERROR: Unsupported operating system\nOnly Linux and Windows are supported", title="[bold red]Error[/bold red]"))
26
+ raise NotImplementedError
27
+
28
+ if authorized_keys.exists():
29
+ split = "\n"
30
+ keys_text = authorized_keys.read_text(encoding="utf-8").split(split)
31
+ key_count = len([k for k in keys_text if k.strip()])
32
+ console.print(Panel(f"🔍 Current SSH authorization status\n✅ Found {key_count} authorized key(s)", title="[bold blue]Status[/bold blue]"))
33
+ if path_to_key.read_text(encoding="utf-8") in authorized_keys.read_text(encoding="utf-8"):
34
+ console.print(Panel(f"⚠️ Key already authorized\nKey: {path_to_key.name}\nStatus: Already present in authorized_keys file\nNo action required", title="[bold yellow]Warning[/bold yellow]"))
35
+ program = ""
36
+ else:
37
+ console.print(Panel(f"➕ Adding new SSH key to authorized keys\n🔑 Key file: {path_to_key.name}", title="[bold blue]Action[/bold blue]"))
38
+ if system() == "Linux":
39
+ program = f"cat {path_to_key} >> ~/.ssh/authorized_keys"
40
+ elif system() == "Windows":
41
+ program_path = LIBRARY_ROOT.joinpath("setup_windows/add-sshkey.ps1")
42
+ program = program_path.expanduser().read_text(encoding="utf-8")
43
+ place_holder = r'$sshfile = "$env:USERPROFILE\.ssh\pubkey.pub"'
44
+ assert place_holder in program, f"This section performs string manipulation on the script {program_path} to add the key to the authorized_keys file. The script has changed and the string {place_holder} is not found."
45
+ program = program.replace(place_holder, f'$sshfile = "{path_to_key}"')
46
+ console.print(Panel("🔧 Configured PowerShell script for Windows\n📝 Replaced placeholder with actual key path", title="[bold blue]Configuration[/bold blue]"))
47
+ else:
48
+ raise NotImplementedError
49
+ else:
50
+ console.print(Panel(f"📝 Creating new authorized_keys file\n🔑 Using key: {path_to_key.name}", title="[bold blue]Action[/bold blue]"))
51
+ if system() == "Linux":
52
+ program = f"cat {path_to_key} > ~/.ssh/authorized_keys"
53
+ else:
54
+ program_path = LIBRARY_ROOT.joinpath("setup_windows/openssh-server_add-sshkey.ps1")
55
+ program = PathExtended(program_path).expanduser().read_text(encoding="utf-8").replace('$sshfile=""', f'$sshfile="{path_to_key}"')
56
+ console.print(Panel("🔧 Configured PowerShell script for Windows\n📝 Set key path in script", title="[bold blue]Configuration[/bold blue]"))
57
+
58
+ if system() == "Linux" or system() == "Darwin":
59
+ program += """
60
+ sudo chmod 700 ~/.ssh
61
+ sudo chmod 644 ~/.ssh/authorized_keys
62
+ sudo chmod 644 ~/.ssh/*.pub
63
+ sudo service ssh --full-restart
64
+ # from superuser.com/questions/215504/permissions-on-private-key-in-ssh-folder
65
+ """
66
+ return program
67
+
68
+
69
+
70
+ """
71
+ # Common pitfalls:
72
+ # 🚫 Wrong line endings (LF/CRLF) in config files
73
+ # 🌐 Network port conflicts (try 2222 -> 2223) between WSL and Windows
74
+ # sudo service ssh restart
75
+ # sudo service ssh status
76
+ # sudo nano /etc/ssh/sshd_config
77
+ """
78
+
79
+
80
+ def main(pub_path: Optional[str] = typer.Argument(None, help="Path to the public key file"),
81
+ pub_choose: bool = typer.Option(False, "--choose", "-c", help="Choose from available public keys in ~/.ssh"),
82
+ pub_val: bool = typer.Option(False, "--paste", "-p", help="Paste the public key content manually"),
83
+ from_github: Optional[str] = typer.Option(None, "--from-github", "-g", help="Fetch public keys from a GitHub username")
84
+ ) -> None:
85
+ if pub_path:
86
+ key_path = PathExtended(pub_path).expanduser().absolute()
87
+ if not key_path.exists():
88
+ console.print(Panel(f"❌ ERROR: Provided key path does not exist\nPath: {key_path}", title="[bold red]Error[/bold red]"))
89
+ raise FileNotFoundError(f"Provided key path does not exist: {key_path}")
90
+ console.print(Panel(f"📄 Using provided public key file: {key_path}", title="[bold blue]Info[/bold blue]"))
91
+ program = get_add_ssh_key_script(key_path)
92
+ from machineconfig.utils.code import run_shell_script
93
+ run_shell_script(script=program)
94
+ console.print(Panel("✅ SSH KEY AUTHORIZATION COMPLETED", box=box.DOUBLE_EDGE, title_align="left"))
95
+ return
96
+ elif pub_choose:
97
+ console.print(Panel("🔐 SSH PUBLIC KEY AUTHORIZATION TOOL", box=box.DOUBLE_EDGE, title_align="left"))
98
+ console.print(Panel("🔍 Searching for public keys...", title="[bold blue]SSH Setup[/bold blue]", border_style="blue"))
99
+ pub_keys = PathExtended.home().joinpath(".ssh").search("*.pub")
100
+ if pub_keys:
101
+ console.print(Panel(f"✅ Found {len(pub_keys)} public key(s)", title="[bold green]Status[/bold green]", border_style="green"))
102
+ else:
103
+ console.print(Panel("⚠️ No public keys found", title="[bold yellow]Warning[/bold yellow]", border_style="yellow"))
104
+ return
105
+ console.print(Panel(f"🔄 Processing all {len(pub_keys)} public keys...", title="[bold blue]Processing[/bold blue]", border_style="blue"))
106
+ program = "\n\n\n".join([get_add_ssh_key_script(key) for key in pub_keys])
107
+
108
+ elif pub_val:
109
+ console.print(Panel("📋 Please provide a filename and paste the public key content", title="[bold blue]Input Required[/bold blue]", border_style="blue"))
110
+ key_filename = input("📝 File name (default: my_pasted_key.pub): ") or "my_pasted_key.pub"
111
+ key_path = PathExtended.home().joinpath(f".ssh/{key_filename}")
112
+ key_path.write_text(input("🔑 Paste the public key here: "), encoding="utf-8")
113
+ console.print(Panel(f"💾 Key saved to: {key_path}", title="[bold green]Success[/bold green]", border_style="green"))
114
+ program = get_add_ssh_key_script(key_path)
115
+ elif from_github:
116
+ console.print(Panel(f"🌐 Fetching public keys from GitHub user: {from_github}", title="[bold blue]GitHub Fetch[/bold blue]", border_style="blue"))
117
+ import requests
118
+ # $pubkey_url = 'https://github.com/thisismygitrepo.keys' # $pubkey_string = (Invoke-WebRequest $pubkey_url).Content
119
+ response = requests.get(f"https://api.github.com/users/{from_github}/keys")
120
+ if response.status_code != 200:
121
+ console.print(Panel(f"❌ ERROR: Failed to fetch keys from GitHub user {from_github}\nStatus Code: {response.status_code}", title="[bold red]Error[/bold red]", border_style="red"))
122
+ raise RuntimeError(f"Failed to fetch keys from GitHub user {from_github}: Status Code {response.status_code}")
123
+ keys = response.json()
124
+ if not keys:
125
+ console.print(Panel(f"⚠️ No public keys found for GitHub user: {from_github}", title="[bold yellow]Warning[/bold yellow]", border_style="yellow"))
126
+ return
127
+ console.print(Panel(f"✅ Found {len(keys)} public key(s) for user: {from_github}", title="[bold green]Success[/bold green]", border_style="green"))
128
+ key_path = PathExtended.home().joinpath(f".ssh/{from_github}_github_keys.pub")
129
+ key_path.write_text("\n".join([key["key"] for key in keys]), encoding="utf-8")
130
+ console.print(Panel(f"💾 Keys saved to: {key_path}", title="[bold green]Success[/bold green]", border_style="green"))
131
+ program = get_add_ssh_key_script(key_path)
132
+ else:
133
+ console.print(Panel("❌ ERROR: No method provided to add SSH key\nUse --help for options", title="[bold red]Error[/bold red]", border_style="red"))
134
+ raise ValueError("No method provided to add SSH key. Use --help for options.")
135
+ console.print(Panel("🚀 SSH KEY AUTHORIZATION READY\nRun the generated script to apply changes", box=box.DOUBLE_EDGE, title_align="left"))
136
+ from machineconfig.utils.code import run_shell_script
137
+ run_shell_script(script=program)
138
+ import socket
139
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
140
+ s.connect(('8.8.8.8',80))
141
+ local_ip_v4 = s.getsockname()[0]
142
+ s.close()
143
+ print(f"This computer is @ {local_ip_v4}")
144
+ console.print(Panel("✅ SSH KEY AUTHORIZATION COMPLETED", box=box.DOUBLE_EDGE, title_align="left"))
145
+
146
+
147
+ if __name__ == "__main__":
148
+ pass
@@ -0,0 +1,82 @@
1
+ """ID"""
2
+
3
+ # from platform import system
4
+ from machineconfig.utils.path_extended import PathExtended
5
+ from machineconfig.utils.options import choose_from_options
6
+ from rich.panel import Panel
7
+ from rich.text import Text
8
+
9
+ BOX_WIDTH = 150 # width for box drawing
10
+
11
+
12
+ def main() -> None:
13
+ title = "🔑 SSH IDENTITY MANAGEMENT"
14
+ print(Panel(Text(title, justify="center"), expand=False))
15
+ print(Panel("🔍 Searching for existing SSH keys...", expand=False))
16
+ private_keys = [x.with_name(x.stem) for x in PathExtended.home().joinpath(".ssh").search("*.pub")]
17
+ private_keys = [x for x in private_keys if x.exists()]
18
+ if private_keys:
19
+ print(Panel(f"✅ Found {len(private_keys)} SSH private key(s)", expand=False))
20
+ else:
21
+ print(Panel("⚠️ No SSH private keys found", expand=False))
22
+
23
+ choice = choose_from_options(msg="Path to private key to be used when ssh'ing: ", options=[str(x) for x in private_keys] + ["I have the path to the key file", "I want to paste the key itself"], multi=False)
24
+
25
+ if choice == "I have the path to the key file":
26
+ print(Panel("📄 Please enter the path to your private key file", expand=False))
27
+ path_to_key = PathExtended(input("📋 Input path here: ")).expanduser().absolute()
28
+ print(Panel(f"📂 Using key from custom path: {path_to_key}", expand=False))
29
+
30
+ elif choice == "I want to paste the key itself":
31
+ print(Panel("📋 Please provide a filename and paste the private key content", expand=False))
32
+ key_filename = input("📝 File name (default: my_pasted_key): ") or "my_pasted_key"
33
+ path_to_key = PathExtended.home().joinpath(f".ssh/{key_filename}")
34
+ path_to_key.parent.mkdir(parents=True, exist_ok=True)
35
+ path_to_key.write_text(input("🔑 Paste the private key here: "), encoding="utf-8")
36
+ print(Panel(f"💾 Key saved to: {path_to_key}", expand=False))
37
+
38
+ else:
39
+ path_to_key = PathExtended(choice)
40
+ print(Panel(f"🔑 Using selected key: {path_to_key.name}", expand=False))
41
+
42
+ txt = f"IdentityFile {path_to_key.collapseuser().as_posix()}" # adds this id for all connections, no host specified.
43
+ config_path = PathExtended.home().joinpath(".ssh/config")
44
+
45
+ print(Panel("📝 Updating SSH configuration...", expand=False))
46
+
47
+ # Inline the previous modify_text behavior (now deprecated):
48
+ # - If file doesn't exist, seed content with txt_search
49
+ # - Otherwise, replace a matching line or append if not found
50
+ if config_path.exists():
51
+ current = config_path.read_text(encoding="utf-8")
52
+ print(Panel("✏️ Updated existing SSH config file", expand=False))
53
+ else:
54
+ current = txt
55
+ print(Panel("📄 Created new SSH config file", expand=False))
56
+ lines = current.split("\n")
57
+ found = False
58
+ for i, line in enumerate(lines):
59
+ if txt in line:
60
+ lines[i] = txt
61
+ found = True
62
+ if not found:
63
+ lines.insert(0, txt)
64
+ new_content = "\n".join(lines)
65
+ config_path.write_text(new_content, encoding="utf-8")
66
+
67
+ panel_complete = Panel(Text("✅ SSH IDENTITY CONFIGURATION COMPLETE\nIdentity added to SSH config file\nConsider reloading the SSH config to apply changes", justify="center"), expand=False, border_style="green")
68
+ program = f"echo '{panel_complete}'"
69
+
70
+ success_message = f"🎉 CONFIGURATION SUCCESSFUL\nIdentity added: {path_to_key.name}\nConfig file: {config_path}"
71
+ print(Panel(Text(success_message, justify="center"), expand=False, border_style="green"))
72
+
73
+ import subprocess
74
+
75
+ # run program
76
+ subprocess.run(program, shell=True, check=True, text=True)
77
+ print(Panel("🔐 Identity added to SSH agent", expand=False, border_style="green"))
78
+ return None
79
+
80
+
81
+ if __name__ == "__main__":
82
+ pass
@@ -2,7 +2,8 @@
2
2
  # 🔍 File Preview Script for LF File Manager
3
3
  # Uses:
4
4
  # 🖼️ chafa, viu - Image preview
5
- # 📝 pistol - General file preview
5
+ # 📝 bat - Syntax-highlighted text/code preview
6
+ # 📄 pistol - General file preview
6
7
 
7
8
  file=$1
8
9
  width="$2"
@@ -30,6 +31,10 @@ case "$file" in
30
31
  fi
31
32
  exit 0
32
33
  ;;
34
+ # 📝 Text/Code Files - Use bat for syntax highlighting
35
+ *.py|*.json|*.js|*.ts|*.html|*.css|*.scss|*.less|*.xml|*.yml|*.yaml|*.toml|*.ini|*.cfg|*.conf|*.sh|*.bash|*.zsh|*.fish|*.ps1|*.rs|*.go|*.java|*.cpp|*.c|*.h|*.hpp|*.cs|*.php|*.rb|*.pl|*.pm|*.lua|*.vim|*.sql|*.md|*.txt|*.log|*.csv|*.tsv)
36
+ bat --color=always --style=plain --paging=never "$file"
37
+ ;;
33
38
  *)
34
39
  # 📄 Default file preview
35
40
  pistol "$file"
@@ -4,7 +4,428 @@ set icons true # show icons next to files
4
4
  set period 1 # interval to check for directory updates
5
5
  set hidden true # show hidden files by default
6
6
  set incsearch true # jump to first match after each keystroke in search
7
- set dircounts true # show number of items in directory instead of sie
7
+ # LF Configuration File - Updated for latest version
8
+ # Based on lf documentation: https://github.com/gokcehan/lf/blob/master/doc.md
9
+
10
+ # ============================ OPTIONS ============================================
11
+
12
+ # Navigation and display
13
+ set scrolloff 10 # space on top and bottom of screen
14
+ set relativenumber false # show relative line numbers (complements number)
15
+ set number true # show absolute line numbers
16
+ set wrapscroll false # scrolling wraps around the file list
17
+ set wrapscan true # searching wraps around the file list
18
+
19
+ # File display
20
+ set hidden true # show hidden files by default
21
+ set hiddenfiles ".*:*.aux:*.log:*.bbl:*.bcf:*.blg:*.run.xml" # additional hidden patterns
22
+ set dirfirst true # show directories first
23
+ set dironly false # show only directories
24
+ set info "size:time" # show file size and modification time
25
+ set dircounts false # don't show item counts in directories (performance)
26
+ set sizeunits binary # use binary units (1024) instead of decimal (1000)
27
+
28
+ # Icons and colors
29
+ set icons true # show icons next to files
30
+ set drawbox false # don't draw borders around panes
31
+ set roundbox false # rounded corners for borders (when drawbox enabled)
32
+
33
+ # Search and filtering
34
+ set ignorecase true # ignore case in sorting and search
35
+ set smartcase true # override ignorecase when pattern has uppercase
36
+ set ignoredia true # ignore diacritics in sorting and search
37
+ set smartdia false # override ignoredia when pattern has diacritics
38
+ set incsearch true # jump to first match after each keystroke in search
39
+ set incfilter false # don't apply filter after each keystroke
40
+ set filtermethod text # filter method: text, glob, or regex
41
+ set searchmethod text # search method: text, glob, or regex
42
+ set anchorfind true # find command starts matching from beginning
43
+ set findlen 1 # number of characters for find command
44
+
45
+ # File operations
46
+ set preserve "mode" # preserve file attributes when copying
47
+ set dupfilefmt "%f.~%n~" # format for duplicate files
48
+ set selmode all # selection mode: all or dir
49
+
50
+ # Preview
51
+ set preview true # preview files on the right pane
52
+ set previewer ~/.config/machineconfig/settings/lf/linux/exe/previewer.sh
53
+ set cleaner ~/.config/machineconfig/settings/lf/linux/exe/cleaner.sh
54
+ set dirpreviews false # don't preview directories by default
55
+
56
+ # Performance and monitoring
57
+ set period 0 # disable periodic directory updates (0 = disabled)
58
+ set watch false # don't watch filesystem for changes (can be slow)
59
+
60
+ # Mouse and interaction
61
+ set mouse false # disable mouse support
62
+ set showbinds true # show key bindings
63
+
64
+ # UI layout
65
+ set ratios "1:2:3" # ratio of pane widths
66
+
67
+ # Truncation
68
+ set truncatechar "~" # character to show when filename is truncated
69
+ set truncatepct 100 # percentage of space for filename before extension
70
+
71
+ # History and persistence
72
+ set history true # save command history
73
+
74
+ # Special files and behavior
75
+ set ifs "\n" # internal field separator for shell commands
76
+ set shell sh # shell to use
77
+ set shellflag -c # shell flag
78
+ set shellopts "" # shell options
79
+ set waitmsg "Press any key to continue"
80
+
81
+ # Formatting (colors and styles)
82
+ set promptfmt "\033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"
83
+ set cursoractivefmt "\033[7m"
84
+ set cursorparentfmt "\033[7m"
85
+ set cursorpreviewfmt "\033[4m"
86
+ set numberfmt "\033[33m"
87
+ set copyfmt "\033[7;33m"
88
+ set cutfmt "\033[7;31m"
89
+ set selectfmt "\033[7;35m"
90
+ set visualfmt "\033[7;36m"
91
+ set errorfmt "\033[7;31;47m"
92
+ set borderfmt "\033[0m"
93
+ set menufmt "\033[0m"
94
+ set menuheaderfmt "\033[1m"
95
+ set menuselectfmt "\033[7m"
96
+
97
+ # Ruler and status
98
+ set rulerfmt " %a| %p| \033[7;31m %m \033[0m| \033[7;33m %c \033[0m| \033[7;35m %s \033[0m| \033[7;36m %v \033[0m| \033[7;34m %f \033[0m| %i/%t"
99
+ set statfmt "\033[36m%p\033[0m| %c| %u| %g| %S| %t| -> %l"
100
+
101
+ # Sorting
102
+ set sortby natural # sort by: natural, name, ext, size, time, atime, btime, ctime
103
+ set reverse false # don't reverse sort order
104
+
105
+ # Tabstops and display
106
+ set tabstop 8 # number of spaces for tab character
107
+
108
+ # User options (can be accessed in scripts)
109
+ # set user_option value
110
+
111
+ # ============================ KEY BINDINGS ============================================
112
+
113
+ # Clear default mappings that might conflict
114
+ clearmaps
115
+
116
+ # Navigation (vim-like)
117
+ map <up> up
118
+ map <down> down
119
+ map <left> updir
120
+ map <right> open
121
+ map k up
122
+ map j down
123
+ map h updir
124
+ map l open
125
+ map gg top
126
+ map G bottom
127
+ map H high
128
+ map M middle
129
+ map L low
130
+
131
+ # Scrolling
132
+ map <c-u> half-up
133
+ map <c-d> half-down
134
+ map <c-b> page-up
135
+ map <c-f> page-down
136
+ map <c-y> scroll-up
137
+ map <c-e> scroll-down
138
+
139
+ # Jumping
140
+ map ] jump-next
141
+ map [ jump-prev
142
+
143
+ # File operations
144
+ map y copy
145
+ map d cut
146
+ map p paste
147
+ map c clear
148
+ map x delete
149
+ map r rename
150
+
151
+ # Selection and marking
152
+ map v invert
153
+ map u unselect
154
+ map t tag-toggle
155
+ map <space> :toggle; down
156
+
157
+ # Search and find
158
+ map / search
159
+ map ? search-back
160
+ map n search-next
161
+ map N search-prev
162
+ map f find
163
+ map F find-back
164
+ map ; find-next
165
+ map , find-prev
166
+
167
+ # Filter
168
+ map f filter
169
+
170
+ # Marks
171
+ map m mark-save
172
+ map ' mark-load
173
+ map " mark-remove
174
+
175
+ # Commands
176
+ map : read
177
+ map $ shell
178
+ map % shell-pipe
179
+ map ! shell-wait
180
+ map & shell-async
181
+
182
+ # Special
183
+ map . set hidden!
184
+ map zh set hidden!
185
+ map zr set reverse!
186
+ map zn set info
187
+ map zs set info size
188
+ map zt set info time
189
+ map za set info size:time
190
+
191
+ # Sorting shortcuts
192
+ map sn :set sortby natural; set info
193
+ map ss :set sortby size; set info size
194
+ map st :set sortby time; set info time
195
+ map sa :set sortby atime; set info atime
196
+ map sb :set sortby btime; set info btime
197
+ map sc :set sortby ctime; set info ctime
198
+ map se :set sortby ext; set info
199
+
200
+ # UI
201
+ map <c-l> redraw
202
+ map <c-r> reload
203
+
204
+ # Quit
205
+ map q quit
206
+ map ZZ quit
207
+ map ZQ quit!
208
+
209
+ # Help
210
+ map <f-1> help
211
+
212
+ # ============================ CUSTOM COMMANDS =====================================
213
+
214
+ # Open files with appropriate applications
215
+ cmd open &{{
216
+ case $(file --mime-type -Lb "$f") in
217
+ text/*) $EDITOR "$f" ;;
218
+ image/*) imv "$f" ;;
219
+ video/*) mpv "$f" ;;
220
+ audio/*) mpv "$f" ;;
221
+ application/pdf) zathura "$f" ;;
222
+ *) xdg-open "$f" ;;
223
+ esac
224
+ }}
225
+
226
+ # Enhanced paste with progress
227
+ cmd paste &{{
228
+ # Use lf's built-in paste but with custom handling if needed
229
+ # This is a fallback - lf handles paste internally by default
230
+ lf -remote "send $id paste"
231
+ }}
232
+
233
+ # Enhanced delete with trash
234
+ cmd delete &{{
235
+ printf "Delete %d files? [y/N] " $(echo "$fx" | wc -l)
236
+ read -r ans
237
+ [ "$ans" = "y" ] || [ "$ans" = "Y" ] || exit 1
238
+
239
+ # Move to trash instead of permanent deletion
240
+ mkdir -p ~/.trash
241
+ mv "$fx" ~/.trash/
242
+ }}
243
+
244
+ # Bulk rename with vidir
245
+ cmd rename %vidir
246
+
247
+ # Create directories
248
+ cmd mkdir &{{
249
+ printf "Directory name: "
250
+ read -r dirname
251
+ mkdir -p "$dirname"
252
+ }}
253
+
254
+ # Create files
255
+ cmd mkfile &{{
256
+ printf "File name: "
257
+ read -r filename
258
+ $EDITOR "$filename"
259
+ }}
260
+
261
+ # Change permissions
262
+ cmd chmod %{{
263
+ printf "Mode bits: "
264
+ read -r mode
265
+ chmod "$mode" "$fx"
266
+ lf -remote "send $id reload"
267
+ }}
268
+
269
+ # Directory size calculation
270
+ cmd calcdirsize &{{
271
+ for dir in "$fx"; do
272
+ if [ -d "$dir" ]; then
273
+ size=$(du -sh "$dir" | cut -f1)
274
+ lf -remote "send $id addcustominfo \"$dir\" \"$size\""
275
+ fi
276
+ done
277
+ }}
278
+
279
+ # Git status indicators
280
+ cmd git-status &{{
281
+ if git rev-parse --git-dir >/dev/null 2>&1; then
282
+ for file in "$@"; do
283
+ if [ -e "$file" ]; then
284
+ status=$(git status --porcelain "$file" 2>/dev/null | head -n1 | cut -c1-2)
285
+ [ -n "$status" ] && lf -remote "send $id addcustominfo \"$file\" \"$status\""
286
+ fi
287
+ done
288
+ fi
289
+ }}
290
+
291
+ # Fuzzy jump with fzf
292
+ cmd fzf-jump &{{
293
+ dest=$(find . -type d | fzf --height 40% --reverse --header="Jump to directory")
294
+ [ -n "$dest" ] && lf -remote "send $id cd \"$dest\""
295
+ }}
296
+
297
+ # Fuzzy search with ripgrep and fzf
298
+ cmd fzf-search &{{
299
+ RG_PREFIX="rg --column --line-number --no-heading --color=always --smart-case"
300
+ result=$(
301
+ FZF_DEFAULT_COMMAND="$RG_PREFIX ''" \
302
+ fzf --bind "change:reload:$RG_PREFIX {q} || true" \
303
+ --ansi --layout=reverse --header 'Search in files' \
304
+ --disabled
305
+ )
306
+ [ -n "$result" ] && file=$(echo "$result" | cut -d: -f1) && lf -remote "send $id select \"$file\""
307
+ }}
308
+
309
+ # Zoxide integration
310
+ cmd zi &{{
311
+ result="$(zoxide query -i)"
312
+ [ -n "$result" ] && lf -remote "send $id cd \"$result\""
313
+ }}
314
+
315
+ # Tere integration (if available)
316
+ cmd tere &{{
317
+ result="$(tere)"
318
+ [ -n "$result" ] && lf -remote "send $id cd \"$result\""
319
+ }}
320
+
321
+ # Bulk operations
322
+ cmd bulk-rename %{{
323
+ vidir "$@"
324
+ }}
325
+
326
+ cmd bulk-chmod %{{
327
+ printf "New permissions: "
328
+ read -r perms
329
+ chmod -R "$perms" "$@"
330
+ lf -remote "send $id reload"
331
+ }}
332
+
333
+ # Archive operations
334
+ cmd extract &{{
335
+ for file in "$@"; do
336
+ case "$file" in
337
+ *.tar.bz2|*.tbz2) tar xjf "$file" ;;
338
+ *.tar.gz|*.tgz) tar xzf "$file" ;;
339
+ *.tar.xz|*.txz) tar xJf "$file" ;;
340
+ *.tar.zst) tar --zstd -xf "$file" ;;
341
+ *.tar) tar xf "$file" ;;
342
+ *.bz2) bunzip2 "$file" ;;
343
+ *.gz) gunzip "$file" ;;
344
+ *.xz) unxz "$file" ;;
345
+ *.zip) unzip "$file" ;;
346
+ *.7z) 7z x "$file" ;;
347
+ *.rar) unrar x "$file" ;;
348
+ *) echo "Unsupported archive: $file" ;;
349
+ esac
350
+ done
351
+ lf -remote "send $id reload"
352
+ }}
353
+
354
+ cmd compress &{{
355
+ printf "Archive name (without extension): "
356
+ read -r name
357
+ printf "Format (tar.gz/zip/7z): "
358
+ read -r format
359
+
360
+ case "$format" in
361
+ tar.gz) tar czf "$name.tar.gz" "$@" ;;
362
+ zip) zip -r "$name.zip" "$@" ;;
363
+ 7z) 7z a "$name.7z" "$@" ;;
364
+ *) echo "Unsupported format" ;;
365
+ esac
366
+ lf -remote "send $id reload"
367
+ }}
368
+
369
+ # ============================ SPECIAL COMMANDS ===================================
370
+
371
+ # Directory change hooks
372
+ cmd on-cd &{{
373
+ # Update terminal title
374
+ lf -remote "send $id tty-write \"\033]0;lf: $PWD\007\""
375
+ }}
376
+
377
+ cmd on-load &git-status
378
+
379
+ # ============================ LEGACY/COMPATIBILITY ==============================
380
+
381
+ # Old mappings (kept for compatibility but prefer new ones above)
382
+ # map Q !~/.config/machineconfig/settings/lf/linux/exe/previewer.sh "$f"
383
+ # map I !cat $f | gum pager
384
+ # map R $~/scripts/croshell -r $f
385
+ # map O $~/scripts/croshell -rj $f
386
+
387
+ # Old jump mappings
388
+ # map jc cd ~/code
389
+ # map jd cd ~/data
390
+ # map jD cd ~/Downloads
391
+ # map jx cd ~/dotfiles
392
+ # map jh cd ~
393
+ # map jj $~/scripts/croshell -j --read $f
394
+
395
+ # Old operation mappings
396
+ # map od cut
397
+ # map op paste
398
+ # map oy copy
399
+ # map oc $echo $f | xclip
400
+ # map or rename
401
+ # map of reload
402
+ # map os mark-save
403
+ # map ol mark-load
404
+ # map oR mark-remove
405
+ # map oD $ouch d $f
406
+ # map oC $ouch c $f "$f.zip"
407
+ # map oL $ln -s $f ~/tmp_results/tmp_links/$(basename "$f")
408
+
409
+ # Old make mappings
410
+ # map md mkdir
411
+ # map mf mkfile
412
+ # map mF sudomkfile
413
+ # map mp chmod
414
+
415
+ # Old junk mappings
416
+ # map <c-f> :fzf_jump
417
+ # map gs :fzf_search
418
+ # map J broot_jump
419
+ # map F fzf_jump
420
+
421
+ # Old command definitions (replaced with modern equivalents above)
422
+ # cmd fzf_jump ${{ ... }}
423
+ # cmd fzf_search ${{ ... }}
424
+ # cmd broot_jump ${{ ... }}
425
+ # cmd mkdir ${{ ... }}
426
+ # cmd mkfile ${{ ... }}
427
+ # cmd sudomkfile ${{ ... }}
428
+ # cmd chmod ${{ ... }}
8
429
  set info "size" # list directory information on the right
9
430
  set sortby "natural" # don't sort files in any special way
10
431
  # set drawbox true # draw a border around all panes
@@ -14,8 +435,8 @@ set number true # show line numbers
14
435
 
15
436
  set preview true # preview file on the right pane
16
437
  # set previewer chafa --format sixel --work 9 --optimize 9 --stretch --zoom --size 140x80
17
- set previewer $HOME/.config/machineconfig/settings/lf/linux/exe/previewer.sh
18
- set cleaner $HOME/.config/machineconfig/settings/lf/linux/exe/cleaner.sh
438
+ set previewer ~/.config/machineconfig/settings/lf/linux/exe/previewer.sh
439
+ set cleaner ~/.config/machineconfig/settings/lf/linux/exe/cleaner.sh
19
440
  # set previewer pistol
20
441
 
21
442
  # set sixels true
@@ -48,16 +469,10 @@ set ratios '1:2:3' # ratio of pane widths
48
469
 
49
470
 
50
471
  # test image viewer
51
- map Q !$HOME/.config/machineconfig/settings/lf/linux/exe/previewer.sh "$f"
472
+ map Q !~/.config/machineconfig/settings/lf/linux/exe/previewer.sh "$f"
52
473
 
53
474
  # key bindings
54
- map vmap v # default is invert
55
475
  map V invert
56
- map p
57
- map x
58
- map c
59
- map v
60
- # map D
61
476
  map D $diskonaut
62
477
  map K $kondo $f
63
478
 
@@ -80,7 +495,6 @@ map <enter> open
80
495
 
81
496
 
82
497
  # w shells
83
- map w
84
498
  map ww bash
85
499
  # map wp $powershell
86
500
  map wr $~/scripts/croshell
@@ -95,7 +509,6 @@ map O $~/scripts/croshell -rj $f
95
509
  map c clear
96
510
  map <delete> delete
97
511
 
98
- map o
99
512
  map od cut
100
513
  map op paste
101
514
  map oy copy
@@ -107,10 +520,9 @@ map ol mark-load
107
520
  map oR mark-remove
108
521
  map oD $ouch d $f
109
522
  map oC $ouch c $f "$f.zip"
110
- map oL $ln -s $f $HOME/tmp_results/tmp_links/$(basename "$f")
523
+ map oL $ln -s $f ~/tmp_results/tmp_links/$(basename "$f")
111
524
 
112
525
  # j jump
113
- map j
114
526
  map jc cd ~/code
115
527
  map jd cd ~/data
116
528
  map jD cd ~/Downloads
@@ -132,7 +544,6 @@ cmd ter ${{
132
544
  map T ter #!tere
133
545
 
134
546
  # m make
135
- map m
136
547
  map md mkdir
137
548
  map mf mkfile
138
549
  map mF sudomkfile
@@ -160,10 +571,6 @@ cmd fzf_jump ${{
160
571
  }}
161
572
 
162
573
 
163
- cmd fzf2g $(~/scripts/fzf2g.sh $args[1])
164
- # map F $nano fzf2g $args[1]
165
-
166
-
167
574
  cmd fzf_search ${{
168
575
  res="$( \
169
576
  RG_PREFIX="rg --column --line-number --no-heading --color=always \
@@ -12,4 +12,4 @@ if ! command -v uv &> /dev/null; then
12
12
  echo """🔍 uv command not found in PATH ➕ Adding uv to system PATH..."""
13
13
  export PATH="$HOME/.local/bin:$PATH"
14
14
  fi
15
- $HOME/.local/bin/uv python install 3.13
15
+ $HOME/.local/bin/uv python install 3.14
@@ -7,4 +7,4 @@ if (-not (Test-Path -Path "$HOME\.local\bin\uv.exe")) {
7
7
  Write-Output "uv binary found, updating..."
8
8
  & "$HOME\.local\bin\uv.exe" self update
9
9
  }
10
- & "$HOME\.local\bin\uv.exe" python install 3.13
10
+ & "$HOME\.local\bin\uv.exe" python install 3.14
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: machineconfig
3
- Version: 5.76
3
+ Version: 5.77
4
4
  Summary: Dotfiles management package
5
5
  Author-email: Alex Al-Saffar <programmer@usa.com>
6
6
  License: Apache 2.0
@@ -123,7 +123,7 @@ machineconfig/scripts/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
123
123
  machineconfig/scripts/python/agents.py,sha256=DIfM7mqi8BhB7PWk-UiBNOYjUzQHdeA1hoS8v3FHKPQ,10446
124
124
  machineconfig/scripts/python/cloud.py,sha256=ubLmf06FSdi1NawpQDgUDAtYb9cZSQqHbSUHzAwRIas,1199
125
125
  machineconfig/scripts/python/croshell.py,sha256=zVlHH60HVlqZweYyt2VW_Zt2_a9tR8fK5W-9pZ6egMs,7083
126
- machineconfig/scripts/python/devops.py,sha256=fxa-C4J4Ds8etPx8sfJOj32llcGJf7W4rfbE2OEgjzE,2049
126
+ machineconfig/scripts/python/devops.py,sha256=9VgoOQLLOpCgJDu6j4PbydKCsjvmNoPriuVL35WT3HE,2102
127
127
  machineconfig/scripts/python/devops_navigator.py,sha256=4O9_-ACeP748NcMjWQXZF7mBQpMPxqCGhLvPG3DMi4Q,236
128
128
  machineconfig/scripts/python/entry.py,sha256=Az7dK1eXHGW5l46Yg10Cd88VChCdhvLAzO3e1A3r56A,2176
129
129
  machineconfig/scripts/python/fire_jobs.py,sha256=O5DrckUGLxGblOcLf_iXU31pmCSpTg-c0hQZxQKD1os,13591
@@ -177,9 +177,9 @@ machineconfig/scripts/python/devops_helpers/__init__.py,sha256=47DEQpj8HBSa-_TIm
177
177
  machineconfig/scripts/python/devops_helpers/cli_config.py,sha256=wnQyhN-LbuIpVKvZhOxv8_UR7cwFTlKpZMqL3Ydi3Zo,5332
178
178
  machineconfig/scripts/python/devops_helpers/cli_config_dotfile.py,sha256=rjTys4FNf9_feP9flWM7Zvq17dxWmetSiGaHPxp25nk,2737
179
179
  machineconfig/scripts/python/devops_helpers/cli_data.py,sha256=kvJ7g2CccjjXIhCwdu_Vlif8JHC0qUoLjuGcTSqT-IU,514
180
- machineconfig/scripts/python/devops_helpers/cli_nw.py,sha256=U-W6ox-7ctGqQcjFWsDwZKmqQdl1etz9CMOes-B0Wgc,2959
180
+ machineconfig/scripts/python/devops_helpers/cli_nw.py,sha256=oFATGL47At4xr09qf2Rt1Q3b_YuUIVSGs44GQcGbNbE,3398
181
181
  machineconfig/scripts/python/devops_helpers/cli_repos.py,sha256=HJH5ZBob_Uzhc3fDgG9riOeW6YEJt88xTjQYcEUPmUY,12015
182
- machineconfig/scripts/python/devops_helpers/cli_self.py,sha256=Zw8x_YhbH6XjLt24RLBmmzPVmLcA_OZYrVBlN-i4Zmo,3863
182
+ machineconfig/scripts/python/devops_helpers/cli_self.py,sha256=c5XDe0Fzox2NVkOPIixH-kHIloGwg8U8aMGR2I74gag,4564
183
183
  machineconfig/scripts/python/devops_helpers/cli_share_server.py,sha256=285OzxttCx7YsrpOkaapMKP1eVGHmG5TkkaSQnY7i3c,3976
184
184
  machineconfig/scripts/python/devops_helpers/cli_terminal.py,sha256=k_PzXaiGyE0vXr0Ii1XcJz2A7UvyPJrR31TRWt4RKRI,6019
185
185
  machineconfig/scripts/python/devops_helpers/devops_add_identity.py,sha256=wvjNgqsLmqD2SxbNCW_usqfp0LI-TDvcJJKGOWt2oFw,3775
@@ -225,6 +225,8 @@ machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py,sha256=fVKbiAov7qG
225
225
  machineconfig/scripts/python/helpers_repos/grource.py,sha256=IywQ1NDPcLXM5Tr9xhmq4tHfYspLRs3pF20LP2TlgIQ,14595
226
226
  machineconfig/scripts/python/helpers_repos/secure_repo.py,sha256=g0o3SHBwicro1K51IY1Wg0_rkBJQ3esHPcsfNHu4Q8A,1005
227
227
  machineconfig/scripts/python/nw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
228
+ machineconfig/scripts/python/nw/add_ssh_key.py,sha256=dYOK9vCB6I9YSeCLO7Hid1IaFjiEs9n_gugDSddtGU8,9298
229
+ machineconfig/scripts/python/nw/devops_add_identity.py,sha256=aPjcHbTLhxYwWYcandyAHdwuO15ZBu3fB82u6bI0tMQ,3773
228
230
  machineconfig/scripts/python/nw/mount_drive,sha256=zemKofv7hOmRN_V3qK0q580GkfWw3VdikyVVQyiu8j8,3514
229
231
  machineconfig/scripts/python/nw/mount_nfs,sha256=DdJqswbKLu8zqlVR3X6Js30D4myJFPVzHHNkWTJqDUQ,1855
230
232
  machineconfig/scripts/python/nw/mount_nfs.py,sha256=lOMDY4RS7tx8gsCazVR5tNNwFbaRyO2PJlnwBCDQgCM,3573
@@ -269,7 +271,7 @@ machineconfig/settings/keyboard/espanso/match/base.yml,sha256=A0QcNSzbdqSUNh42Wq
269
271
  machineconfig/settings/keyboard/kanata/kanata.kbd,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
270
272
  machineconfig/settings/lf/linux/colors,sha256=uSW9O3CkiVomxK8-JN8hQRcM71yADuOSjichbfBFTpg,4148
271
273
  machineconfig/settings/lf/linux/icons,sha256=liVoi5nOaxFyujil2z7Pcu8l5dG7_uurJ9IJD36jVhI,7147
272
- machineconfig/settings/lf/linux/lfrc,sha256=VhPnKMXQfYWQpaUPKdHDWw2IPx1t_4zLoiNlCzWdeLE,5181
274
+ machineconfig/settings/lf/linux/lfrc,sha256=tLsoQtPm73qQy9jwjAcRFuZNQHNmR1dTXHVsa5iqby8,16270
273
275
  machineconfig/settings/lf/linux/autocall/delete.sh,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
274
276
  machineconfig/settings/lf/linux/autocall/on-cd.sh,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
275
277
  machineconfig/settings/lf/linux/autocall/on-quit.sh,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -281,7 +283,7 @@ machineconfig/settings/lf/linux/exe/cleaner.sh,sha256=NKK30rUcrHXnwy8srylyaWL-XJ
281
283
  machineconfig/settings/lf/linux/exe/fzf_nano.sh,sha256=b6YTQ5zXrdV4tiedJHqWJLVud6LNWDtUXig0U7o9zLc,619
282
284
  machineconfig/settings/lf/linux/exe/leftpane_previewer.sh,sha256=KXMq81hIvU9uzOuanluVcxVgJmEOYy-5sUbzcuc9b6U,200
283
285
  machineconfig/settings/lf/linux/exe/lfcd.sh,sha256=dh_9JZHGHeNjGd8BE1NYNK4fO3Exwa9bAehywGYhSNs,770
284
- machineconfig/settings/lf/linux/exe/previewer.sh,sha256=Yqjp0ZQ-96suN_DqrT0t72Bzg-LwaY8L69VZL5epEb0,796
286
+ machineconfig/settings/lf/linux/exe/previewer.sh,sha256=g2gzBL_fa72FvJHUknzmZT5D8JHyFuwB0sdMWhWZjZE,1210
285
287
  machineconfig/settings/lf/linux/exe/previewer_archive.sh,sha256=MGAlXrso-RSrvBbkFnmBHSGoPB54ZHtY_s5Qd1-fNZM,3536
286
288
  machineconfig/settings/lf/windows/cd_tere.ps1,sha256=kiW7LiE0Pe2Pjq_4CO2N36wHx_0N-9fXXUDUvHWCOuc,203
287
289
  machineconfig/settings/lf/windows/cd_zoxide.ps1,sha256=gQKJPa_YDmp5BiCKeYYHkZB_p7py8EXIhXtZi6vnN8o,159
@@ -360,7 +362,7 @@ machineconfig/setup_linux/__init__.py,sha256=7VLvb9uj9XJYtlYu9lgavQuxjX3tVCE9i8W
360
362
  machineconfig/setup_linux/apps.sh,sha256=XOEzhuwYNat83ybamUdnVhDaGf2wlQiT5wVNvz2aJYM,3262
361
363
  machineconfig/setup_linux/apps_desktop.sh,sha256=L2b_pcw3GiQdoAaoMO7J4bVvUoG5Pnuy9kDhV8JqprU,3325
362
364
  machineconfig/setup_linux/apps_gui.sh,sha256=lFPYq7H2bRogPwW6QoEuSr9GnTjHS-jRM_eYg2rjOmM,2301
363
- machineconfig/setup_linux/uv.sh,sha256=VxjGbRif_I4hZ9vogOZYxQhFGqX91zlvVfELvvqRwB8,487
365
+ machineconfig/setup_linux/uv.sh,sha256=cyegPmMMB7B3OnVx9KxZiU1JQU3Z_oqboUgwzmW2W40,487
364
366
  machineconfig/setup_linux/nix/cli_installation.sh,sha256=gVvszYZJgKPRJx2SEaE31BXDP0Fmeta4--gpr-zJZlY,4010
365
367
  machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh,sha256=F5dbg0n9RHsKGPn8fIdZMn3p0RrHEkb8rWBGsdVGbus,1207
366
368
  machineconfig/setup_linux/ssh/openssh_all.sh,sha256=3dg6HEUFbHQOzLfSAtzK_D_GB8rGCCp_aBnxNdnidVc,824
@@ -369,7 +371,7 @@ machineconfig/setup_linux/web_shortcuts/android.sh,sha256=gzep6bBhK7FCBvGcXK0fdJ
369
371
  machineconfig/setup_linux/web_shortcuts/interactive.sh,sha256=IJKYO2cxpg0UD9lvCHjIAg3u8d9S5zalU3DecSrxhSg,880
370
372
  machineconfig/setup_windows/__init__.py,sha256=NnSVZkIBoxoMgkj-_KAqGonH3YziBIWXOKDEcmNAGTY,386
371
373
  machineconfig/setup_windows/apps.ps1,sha256=G5GqZ9G0aiQr_A-HaahtRdzpaTTdW6n3DRKMZWDTSPc,11214
372
- machineconfig/setup_windows/uv.ps1,sha256=mzkFJUQ57dukVQtY7WqAQIVUDMcixnkir8aNM_TYrl4,350
374
+ machineconfig/setup_windows/uv.ps1,sha256=ukk1Abh-q-RfpoEqI2XTE2dcQJmHk0VFF6WqkK3TW8Q,350
373
375
  machineconfig/setup_windows/others/docker.ps1,sha256=M8NfsSxH8YlmY92J4rSe1xWOwTW8IFrdgb8cI8Riu2E,311
374
376
  machineconfig/setup_windows/others/obs.ps1,sha256=2andchcXpxS3rqZjGaMpY5VShxTAKWvw6eCrayjuaLo,30
375
377
  machineconfig/setup_windows/others/power_options.ps1,sha256=c7Hn94jBD5GWF29CxMhmNpuM0hgXTQgVJmIRR_7sdcY,182
@@ -418,8 +420,8 @@ machineconfig/utils/schemas/installer/installer_types.py,sha256=QClRY61QaduBPJoS
418
420
  machineconfig/utils/schemas/layouts/layout_types.py,sha256=TcqlZdGVoH8htG5fHn1KWXhRdPueAcoyApppZsPAPto,2020
419
421
  machineconfig/utils/schemas/repos/repos_types.py,sha256=ECVr-3IVIo8yjmYmVXX2mnDDN1SLSwvQIhx4KDDQHBQ,405
420
422
  machineconfig/utils/ssh_utils/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
421
- machineconfig-5.76.dist-info/METADATA,sha256=721YpHsqSxaReb8xGu_j03HCJvY7RQgcek0YANHylX0,3103
422
- machineconfig-5.76.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
423
- machineconfig-5.76.dist-info/entry_points.txt,sha256=M0jwN_brZdXWhmNVeXLvdKxfkv8WhhXFZYcuKBA9qnk,418
424
- machineconfig-5.76.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
425
- machineconfig-5.76.dist-info/RECORD,,
423
+ machineconfig-5.77.dist-info/METADATA,sha256=d7RjZI75mRctKM8EqCpyFnVcHW_YQP0cbbHPnJm4uFM,3103
424
+ machineconfig-5.77.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
425
+ machineconfig-5.77.dist-info/entry_points.txt,sha256=M0jwN_brZdXWhmNVeXLvdKxfkv8WhhXFZYcuKBA9qnk,418
426
+ machineconfig-5.77.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
427
+ machineconfig-5.77.dist-info/RECORD,,