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

@@ -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()
@@ -3,7 +3,7 @@
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")],
@@ -22,15 +22,6 @@ def public(method: Annotated[Literal["symlink", "copy"], typer.Option(..., "--me
22
22
  import machineconfig.profile.create_links_export as create_links_export
23
23
  create_links_export.main_public_from_parser(method=method, on_conflict=on_conflict, which=which, interactive=interactive)
24
24
 
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
-
34
25
  def shell():
35
26
  """🔗 Configure your shell profile."""
36
27
  from machineconfig.profile.create_shell_profile import create_default_shell_profile
@@ -104,8 +95,8 @@ def get_app():
104
95
  config_apps.command("v", no_args_is_help=True, hidden=True)(private)
105
96
  config_apps.command("public", no_args_is_help=True, help="🔗 [b] Manage public configuration files.")(public)
106
97
  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)
98
+ config_apps.command("dotfile", no_args_is_help=True, help="🔗 [d] Manage dotfiles.")(dotfile_module.main)
99
+ config_apps.command("d", no_args_is_help=True, hidden=True)(dotfile_module.main)
109
100
  config_apps.command("shell", no_args_is_help=False, help="🔗 [s] Configure your shell profile.")(shell)
110
101
  config_apps.command("s", no_args_is_help=False, help="Configure your shell profile.", hidden=True)(shell)
111
102
  config_apps.command("path", no_args_is_help=False, help="📚 [p] NAVIGATE PATH variable with TUI")(path)
@@ -1,41 +1,44 @@
1
1
  """Like yadm and dotter."""
2
2
 
3
- from typing import Annotated
4
-
3
+ from typing import Annotated, Literal
5
4
  import typer
6
5
 
7
6
 
8
7
  def main(
9
8
  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")] = "",
9
+ method: Annotated[Literal["symlink", "copy"], typer.Option(..., "--method", "-m", help="Method to use for linking files")] = "copy",
10
+ on_conflict: Annotated[Literal["throw-error", "overwriteSelfManaged", "backupSelfManaged", "overwriteDefaultPath", "backupDefaultPath"], typer.Option(..., "--on-conflict", "-o", help="Action to take on conflict")] = "throw-error",
11
+ sensitivity: Annotated[Literal["private", "public"], typer.Option(..., "--sensitivity", "-s", help="Sensitivity of the config file.")] = "private",
12
+ destination: Annotated[str, typer.Option("--destination", "-d", help="destination folder (override the default, use at your own risk)")] = "",
12
13
  ) -> None:
13
-
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
-
35
+ from machineconfig.utils.path_extended import PathExtended
36
+ if method == "copy":
37
+ copy_map(config_file_default_path=PathExtended(orig_path), self_managed_config_file_path=PathExtended(new_path), on_conflict=on_conflict)
38
+ elif method == "symlink":
39
+ symlink_map(config_file_default_path=PathExtended(orig_path), self_managed_config_file_path=PathExtended(new_path), on_conflict=on_conflict)
40
+ else:
41
+ raise ValueError(f"Unknown method: {method}")
39
42
  console.print(
40
43
  Panel(
41
44
  "\n".join(
@@ -50,23 +53,23 @@ def main(
50
53
  )
51
54
  )
52
55
 
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
- )
56
+ # mapper_snippet = "\n".join(
57
+ # [
58
+ # f"[bold]📝 Edit configuration file:[/] [cyan]nano {PathExtended(CONFIG_ROOT)}/symlinks/mapper.toml[/cyan]",
59
+ # "",
60
+ # f"[{new_path.parent.name}]",
61
+ # f"{orig_path.name.split('.')[0]} = {{ this = '{orig_path.collapseuser().as_posix()}', to_this = '{new_path.collapseuser().as_posix()}' }}",
62
+ # ]
63
+ # )
61
64
 
62
- console.print(
63
- Panel(
64
- mapper_snippet,
65
- title="Mapper Entry",
66
- border_style="cyan",
67
- padding=(1, 2),
68
- )
69
- )
65
+ # console.print(
66
+ # Panel(
67
+ # mapper_snippet,
68
+ # title="Mapper Entry",
69
+ # border_style="cyan",
70
+ # padding=(1, 2),
71
+ # )
72
+ # )
70
73
 
71
74
 
72
75
  def arg_parser() -> None:
@@ -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
 
@@ -162,14 +162,15 @@ 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
+ 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
+
165
173
  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
174
  raise RuntimeError(f"Conflict detected: {config_file_default_path} and {self_managed_config_file_path} both exist with different content")
174
175
  elif on_conflict == "overwriteSelfManaged":
175
176
  action_taken = "backing_up_target"
@@ -289,6 +290,14 @@ def copy_map(config_file_default_path: PathExtended, self_managed_config_file_pa
289
290
  config_file_default_path.delete(sure=True)
290
291
  else:
291
292
  # Files are different, use on_conflict strategy
293
+ import subprocess
294
+ command = f"""delta --side-by-side "{config_file_default_path}" "{self_managed_config_file_path}" """
295
+ try:
296
+ console.print(Panel(f"🆘 CONFLICT DETECTED | Showing diff between {config_file_default_path} and {self_managed_config_file_path}", title="Conflict Detected", expand=False))
297
+ subprocess.run(command, shell=True, check=True)
298
+ except Exception:
299
+ console.print(Panel("⚠️ Could not show diff using 'delta'. Please install 'delta' for better diff visualization.", title="Delta Not Found", expand=False))
300
+
292
301
  match on_conflict:
293
302
  case "throw-error":
294
303
  raise RuntimeError(f"Conflict detected: {config_file_default_path} and {self_managed_config_file_path} both exist with different content")
@@ -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.2
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
 
@@ -121,6 +121,7 @@ machineconfig/scripts/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
121
121
  machineconfig/scripts/python/agents.py,sha256=aVbLQDgpngXZm4taHcED4sAxyHvV2_Dz5VW3apPcQcY,10651
122
122
  machineconfig/scripts/python/cloud.py,sha256=yAD6ciKiEtv2CH3g2NScDK5cpCZQi7Vu8yyeehw_cU8,1263
123
123
  machineconfig/scripts/python/croshell.py,sha256=QyQbVboNqDQHJkUeSsJvdT212t4TW46yat3GBzneqsQ,8649
124
+ machineconfig/scripts/python/define.py,sha256=vk7E5twa3DtK10ZxRVlbklYHzcou7M3zPAoV5z9_JGI,645
124
125
  machineconfig/scripts/python/devops.py,sha256=Lv4d-UlyOREj4VTcu_pxswYo54Mawe3XGeKjreGQDYg,2222
125
126
  machineconfig/scripts/python/devops_navigator.py,sha256=5Cm384D4S8_GsvMzTwr0C16D0ktf8_5Mk5bEJncwDO8,237
126
127
  machineconfig/scripts/python/fire_jobs.py,sha256=-xrUlBQ90asQkXuWESiDsD6D05Xuw0-NMmfwBerwSjg,13874
@@ -192,8 +193,8 @@ machineconfig/scripts/python/helpers_croshell/start_slidev.py,sha256=HfJReOusTPh
192
193
  machineconfig/scripts/python/helpers_croshell/viewer.py,sha256=heQNjB9fwn3xxbPgMofhv1Lp6Vtkl76YjjexWWBM0pM,2041
193
194
  machineconfig/scripts/python/helpers_croshell/viewer_template.py,sha256=ve3Q1-iKhCLc0VJijKvAeOYp2xaFOeIOC_XW956GWCc,3944
194
195
  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
196
+ machineconfig/scripts/python/helpers_devops/cli_config.py,sha256=mFEqpjCEhRfHRX4I8NspFmIOB8VvsJ6U9B5YOCIVDlE,6875
197
+ machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py,sha256=Qp6Pgbs-nJzf7_us_wPsIimPLJhY4TFYwIiFcmy-dxU,3249
197
198
  machineconfig/scripts/python/helpers_devops/cli_data.py,sha256=79Xvx7YnbueruEnl69hrDg2AhVxf_zCUdlVcKfeMGyQ,1774
198
199
  machineconfig/scripts/python/helpers_devops/cli_nw.py,sha256=9NcVJvPYaUDtmI_DSKthZxR4emMBeNWVM_M5f0YR8EQ,7302
199
200
  machineconfig/scripts/python/helpers_devops/cli_repos.py,sha256=Xwkv1adqHZvTfRSPWiqSK3PZ1XADyx3llw_YkbxaKyE,12505
@@ -368,7 +369,7 @@ machineconfig/settings/zellij/layouts/panes.kdl,sha256=KlhKtelBy4Z2ENV_pix4xE7NH
368
369
  machineconfig/settings/zellij/layouts/st.kdl,sha256=QXLRK7Wx05aKbKRHVmm4RspLYzPmEa44JMK1TwXQk58,523
369
370
  machineconfig/settings/zellij/layouts/st2.kdl,sha256=1FKTH3qQWYMWp_wPMreP7fKOTlVd4cfBy3J8fv4zCBc,1489
370
371
  machineconfig/settings/zellij/layouts/stacked_panes.kdl,sha256=usY8kKKwX1KUMXnWDivPg0i0drpM1Biw-tOnNZVjiZU,163
371
- machineconfig/setup_linux/__init__.py,sha256=7VLvb9uj9XJYtlYu9lgavQuxjX3tVCE9i8WdOjB3Qa4,314
372
+ machineconfig/setup_linux/__init__.py,sha256=5gT_vc6ze_RUMx9mk7_9kkOTyPPTo3MJFh2fq8MGToU,391
372
373
  machineconfig/setup_linux/apps.sh,sha256=XOEzhuwYNat83ybamUdnVhDaGf2wlQiT5wVNvz2aJYM,3262
373
374
  machineconfig/setup_linux/apps_desktop.sh,sha256=L2b_pcw3GiQdoAaoMO7J4bVvUoG5Pnuy9kDhV8JqprU,3325
374
375
  machineconfig/setup_linux/apps_gui.sh,sha256=lFPYq7H2bRogPwW6QoEuSr9GnTjHS-jRM_eYg2rjOmM,2301
@@ -401,7 +402,7 @@ machineconfig/utils/accessories.py,sha256=Rs8R0GUb2Ub6YimkgXHnI02CShS5BKlrZdCigV
401
402
  machineconfig/utils/code.py,sha256=fVeQnhZE8-aoPBsrgjNcBTcv3NuyBSSQv9P8jyC8W_M,6635
402
403
  machineconfig/utils/installer.py,sha256=1ScBaTe_pRsfTYht9-LXmirgnNizNy8u1GgetUfEDO4,10351
403
404
  machineconfig/utils/io.py,sha256=4dSieoqZO8Vvi4vW8lLoITDHBvmFp4dtl3kyeZHQ6Co,2528
404
- machineconfig/utils/links.py,sha256=ffc8fwbQ1TVdXYn2J1rq7gCZHidxwCzlSppdyrzq4LA,24382
405
+ machineconfig/utils/links.py,sha256=j2gHll55iqUXtB4NQbo3QwANRL1ztLGZfpcwLoJQZyk,25033
405
406
  machineconfig/utils/meta.py,sha256=4ocYH3Zi6bVN6FVgXoGIfoasV6oxi67I9rQ8hvyYinc,9892
406
407
  machineconfig/utils/notifications.py,sha256=tuXIudcip0tEioG-bm8BbLr3FMDve4f6BktlznBhKxM,9013
407
408
  machineconfig/utils/options.py,sha256=VWYx3EKJxIp-CJ8gDGYdjclKSc1tMUhyrC8v3seeneo,7447
@@ -414,7 +415,7 @@ machineconfig/utils/source_of_truth.py,sha256=ZAnCRltiM07ig--P6g9_6nEAvNFC4X4ERF
414
415
  machineconfig/utils/ssh.py,sha256=6LHTYA4OB5GtsmTjQ8Rut0S6JUqZgm7Vx_Rm2s1G98s,39008
415
416
  machineconfig/utils/terminal.py,sha256=VDgsjTjBmMGgZN0YIc0pJ8YksLDrBtiXON1EThy7_is,4264
416
417
  machineconfig/utils/tst.py,sha256=6u1GI49NdcpxH2BYGAusNfY5q9G_ytCGVzFM5b6HYpM,674
417
- machineconfig/utils/upgrade_packages.py,sha256=i7K2bpmwdmag833t1ZmYvF45rO8GMkmJvLP3C1AyNEI,5694
418
+ machineconfig/utils/upgrade_packages.py,sha256=75kabcI-chMiaBnafJ_hdhDUz_GyH7AsDt7rW3hyu9M,5851
418
419
  machineconfig/utils/ve.py,sha256=L-6PBXnQGXThiwWgheJMQoisAZOZA6SVCbGw2J-GFnI,2414
419
420
  machineconfig/utils/ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
420
421
  machineconfig/utils/cloud/onedrive/README.md,sha256=i20oRG110AN0yLF3DARHfWXDJjPBiSgWI8CP2HQAqrk,3774
@@ -440,8 +441,8 @@ machineconfig/utils/schemas/installer/installer_types.py,sha256=QClRY61QaduBPJoS
440
441
  machineconfig/utils/schemas/layouts/layout_types.py,sha256=TcqlZdGVoH8htG5fHn1KWXhRdPueAcoyApppZsPAPto,2020
441
442
  machineconfig/utils/schemas/repos/repos_types.py,sha256=ECVr-3IVIo8yjmYmVXX2mnDDN1SLSwvQIhx4KDDQHBQ,405
442
443
  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,,
444
+ machineconfig-7.2.dist-info/METADATA,sha256=DC93r9S7PPEHc072tYmxoheeY2fls1KhmVq93sGl5yg,3395
445
+ machineconfig-7.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
446
+ machineconfig-7.2.dist-info/entry_points.txt,sha256=0ho96z7b1toS6CeiajpTwEwQa83UrJ3g1onD4Wxax9o,624
447
+ machineconfig-7.2.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
448
+ machineconfig-7.2.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