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

@@ -165,11 +165,11 @@ AGENTS_DIR="$REPO_ROOT/.ai/agents/$JOB_NAME"
165
165
  LAYOUT_PATH="$REPO_ROOT/.ai/agents/$JOB_NAME/layout_unbalanced.json"
166
166
  LAYOUT_BALANCED_PATH="$REPO_ROOT/.ai/agents/$JOB_NAME/layout_balanced.json"
167
167
 
168
- fire_agents create --context-path $CONTEXT_PATH --tasks-per-prompt 10 --agent crush --prompt-path $PROMPT_PATH --keep-separate --output-path $LAYOUT_PATH --agents-dir $AGENTS_DIR
169
- fire_agents load-balance $LAYOUT_PATH --max-thresh 6 --breaking-method moreLayouts --thresh-type number --output-path $LAYOUT_BALANCED_PATH
168
+ agents create --context-path $CONTEXT_PATH --tasks-per-prompt 10 --agent crush --prompt-path $PROMPT_PATH --keep-separate --output-path $LAYOUT_PATH --agents-dir $AGENTS_DIR
169
+ sessions balance-load $LAYOUT_PATH --max-thresh 6 --breaking-method moreLayouts --thresh-type number --output-path $LAYOUT_BALANCED_PATH
170
170
 
171
- fire_agents run $LAYOUT_BALANCED_PATH --kill-upon-completion
172
- fire_agents collect $AGENTS_DIR "$REPO_ROOT/.ai/agents/$JOB_NAME/collected.txt"
171
+ sessions run $LAYOUT_BALANCED_PATH --kill-upon-completion
172
+ agents collect $AGENTS_DIR "$REPO_ROOT/.ai/agents/$JOB_NAME/collected.txt"
173
173
  """
174
174
  template_powershell = """
175
175
 
@@ -194,11 +194,16 @@ fire_agents collect $AGENTS_DIR "$REPO_ROOT/.ai/agents/$JOB_NAME/collected.txt"
194
194
 
195
195
 
196
196
  def main_from_parser():
197
+ import sys
197
198
  agents_app = typer.Typer(help="🤖 AI Agents management subcommands")
198
199
  agents_app.command("create")(create)
199
200
  agents_app.command("collect")(collect)
200
201
  agents_app.command("template")(template)
201
- return agents_app()
202
+ if len(sys.argv) == 1:
203
+ agents_app(["--help"])
204
+ else:
205
+ agents_app()
206
+
202
207
 
203
208
  if __name__ == "__main__": # pragma: no cover
204
209
  pass
@@ -2,7 +2,6 @@
2
2
 
3
3
  from machineconfig.utils.installer import get_installers_system_groups
4
4
  import typer
5
- from rich.progress import Progress, SpinnerColumn, TextColumn
6
5
  from rich.console import Console
7
6
  from rich.panel import Panel
8
7
  from rich.table import Table
@@ -72,7 +71,9 @@ def main(
72
71
  if interactive:
73
72
  return install_interactively()
74
73
  typer.echo("❌ You must provide either --which, --group, or --interactive/-ia option.")
75
- # typer.help(main)
74
+ import click
75
+ ctx = click.get_current_context()
76
+ typer.echo(ctx.get_help())
76
77
  raise typer.Exit(1)
77
78
 
78
79
 
@@ -45,11 +45,11 @@ def route(args: FireJobArgs, fire_args: str = "") -> None:
45
45
  ipy_profile = "default"
46
46
 
47
47
  if choice_file.suffix == ".py":
48
- kwargs = extract_kwargs(args) # This now returns empty dict, but kept for compatibility
48
+ kwargs_dict = extract_kwargs(args) # This now returns empty dict, but kept for compatibility
49
49
  activate_ve_line = get_ve_activate_line(ve_root=args.ve or ve_root_from_file or "$HOME/code/machineconfig/.venv")
50
50
  else:
51
51
  activate_ve_line = ""
52
- kwargs = {}
52
+ kwargs_dict = {}
53
53
 
54
54
  # ========================= choosing function to run
55
55
  choice_function: Optional[str] = None # Initialize to avoid unbound variable
@@ -64,9 +64,9 @@ def route(args: FireJobArgs, fire_args: str = "") -> None:
64
64
 
65
65
  if choice_function == "RUN AS MAIN":
66
66
  choice_function = None
67
- if len(choice_function_args) > 0 and len(kwargs) == 0:
67
+ if len(choice_function_args) > 0 and len(kwargs_dict) == 0:
68
68
  for item in choice_function_args:
69
- kwargs[item.name] = input(f"Please enter a value for argument `{item.name}` (type = {item.type}) (default = {item.default}) : ") or item.default
69
+ kwargs_dict[item.name] = input(f"Please enter a value for argument `{item.name}` (type = {item.type}) (default = {item.default}) : ") or item.default
70
70
  elif choice_file.suffix == ".sh": # in this case, we choos lines.
71
71
  options = []
72
72
  for line in choice_file.read_text(encoding="utf-8").splitlines():
@@ -88,6 +88,7 @@ def route(args: FireJobArgs, fire_args: str = "") -> None:
88
88
  if choice_file.suffix == ".py":
89
89
  if args.streamlit:
90
90
  import socket
91
+
91
92
  s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
92
93
  try:
93
94
  s.connect(("8.8.8.8", 1))
@@ -153,9 +154,7 @@ def route(args: FireJobArgs, fire_args: str = "") -> None:
153
154
  else:
154
155
  raise NotImplementedError(f"File type {choice_file.suffix} not supported, in the sense that I don't know how to fire it.")
155
156
 
156
- if (
157
- args.module or (args.debug and args.choose_function)
158
- ): # because debugging tools do not support choosing functions and don't interplay with fire module. So the only way to have debugging and choose function options is to import the file as a module into a new script and run the function of interest there and debug the new script.
157
+ if args.module or (args.debug and args.choose_function): # because debugging tools do not support choosing functions and don't interplay with fire module. So the only way to have debugging and choose function options is to import the file as a module into a new script and run the function of interest there and debug the new script.
159
158
  assert choice_file.suffix == ".py", f"File must be a python file to be imported as a module. Got {choice_file}"
160
159
  import_line = get_import_module_code(str(choice_file))
161
160
  if repo_root is not None:
@@ -178,7 +177,7 @@ except (ImportError, ModuleNotFoundError) as ex:
178
177
  txt = (
179
178
  txt
180
179
  + f"""
181
- res = {choice_function}({("**" + str(kwargs)) if kwargs else ""})
180
+ res = {choice_function}({("**" + str(kwargs_dict)) if kwargs_dict else ""})
182
181
  """
183
182
  )
184
183
 
@@ -346,10 +345,10 @@ def main(
346
345
  watch: Annotated[bool, typer.Option("--watch", "-w", help="Watch the file for changes")] = False,
347
346
  ) -> None:
348
347
  """Main function to process fire jobs arguments."""
349
-
348
+
350
349
  # Get Fire arguments from context
351
350
  fire_args = parse_fire_args_from_context(ctx)
352
-
351
+
353
352
  args = FireJobArgs(
354
353
  path=path,
355
354
  function=function,
@@ -381,6 +380,7 @@ def main(
381
380
  except Exception as e:
382
381
  # For other exceptions, print clean error message and exit
383
382
  import sys
383
+
384
384
  print(f"❌ Error: {e}", file=sys.stderr)
385
385
  sys.exit(1)
386
386
 
@@ -389,6 +389,7 @@ def main_from_parser():
389
389
  # from trogon.typer import init_tui
390
390
  # from trogon.typer import init_tui
391
391
  from typer import Typer
392
+
392
393
  app = Typer(add_completion=False)
393
394
  app.command(context_settings={"allow_extra_args": True, "allow_interspersed_args": False})(main)
394
395
  # typer.run(main)
@@ -30,12 +30,70 @@ class FireJobArgs:
30
30
 
31
31
 
32
32
  def extract_kwargs(args: FireJobArgs) -> dict[str, object]:
33
- """Extract kwargs from command line using -- separator.
33
+ """Extract kwargs from command line arguments in Fire format.
34
34
 
35
- Returns empty dict since kwargs are now parsed directly from sys.argv
36
- using the -- separator pattern in the main function.
35
+ Parses Fire-like arguments (e.g., --a=2, --name=value) from sys.argv
36
+ and returns them as a dictionary.
37
+
38
+ Returns:
39
+ Dictionary mapping argument names to their values
37
40
  """
38
- return {}
41
+ import sys
42
+
43
+ kwargs: dict[str, object] = {}
44
+
45
+ # Look for Fire-style arguments in sys.argv
46
+ for arg in sys.argv:
47
+ # Match patterns like --key=value or --key value (but we'll focus on --key=value)
48
+ if arg.startswith('--') and '=' in arg:
49
+ key, value = arg[2:].split('=', 1) # Remove -- prefix and split on first =
50
+
51
+ # Try to convert value to appropriate type
52
+ kwargs[key] = _convert_value_type(value)
53
+ elif arg.startswith('--') and '=' not in arg:
54
+ # Handle boolean flags like --debug
55
+ key = arg[2:] # Remove -- prefix
56
+ # Check if next argument exists and doesn't start with --
57
+ arg_index = sys.argv.index(arg)
58
+ if arg_index + 1 < len(sys.argv) and not sys.argv[arg_index + 1].startswith('--'):
59
+ # Next argument is the value
60
+ value = sys.argv[arg_index + 1]
61
+ kwargs[key] = _convert_value_type(value)
62
+ else:
63
+ # It's a boolean flag
64
+ kwargs[key] = True
65
+
66
+ return kwargs
67
+
68
+
69
+ def _convert_value_type(value: str) -> object:
70
+ """Convert string value to appropriate Python type."""
71
+ # Try to convert to int
72
+ try:
73
+ if '.' not in value and 'e' not in value.lower():
74
+ return int(value)
75
+ except ValueError:
76
+ pass
77
+
78
+ # Try to convert to float
79
+ try:
80
+ return float(value)
81
+ except ValueError:
82
+ pass
83
+
84
+ # Try to convert boolean strings
85
+ if value.lower() in ('true', '1', 'yes', 'on'):
86
+ return True
87
+ elif value.lower() in ('false', '0', 'no', 'off'):
88
+ return False
89
+
90
+ # Try to parse as list (comma-separated values)
91
+ if ',' in value:
92
+ items = [_convert_value_type(item.strip()) for item in value.split(',')]
93
+ return items
94
+
95
+ # Return as string if no conversion possible
96
+ return value
39
97
 
40
98
 
41
99
  def parse_fire_args_from_argv() -> str:
@@ -70,7 +70,12 @@ def main(
70
70
  auto_sync=auto_sync
71
71
  )
72
72
  else:
73
- print("❌ No action specified. Try passing --push, --pull, --commit, or --all.")
73
+ # print("❌ No action specified. Try passing --push, --pull, --commit, or --all.")
74
+ typer.echo("❌ No action specified. Try passing --push, --pull, --commit, or --all.")
75
+ import click
76
+ ctx = click.get_current_context()
77
+ typer.echo(ctx.get_help())
78
+ raise typer.Exit(1)
74
79
 
75
80
 
76
81
  def main_from_parser() -> None:
@@ -4,7 +4,7 @@ from typing import Optional, Literal
4
4
  import typer
5
5
 
6
6
 
7
- def load_balance(layout_path: Path = typer.Argument(..., help="Path to the layout.json file"),
7
+ def balance_load(layout_path: Path = typer.Argument(..., help="Path to the layout.json file"),
8
8
  max_thresh: int = typer.Option(..., help="Maximum tabs per layout"),
9
9
  thresh_type: Literal['number', 'weight'] = typer.Option(..., help="Threshold type"),
10
10
  breaking_method: Literal['moreLayouts', 'combineTabs'] = typer.Option(..., help="Breaking method"),
@@ -129,9 +129,13 @@ def launch(layout_path: str = typer.Argument(..., help="Path to the layout.json
129
129
 
130
130
  def main_from_parser():
131
131
  layouts_app = typer.Typer(help="Layouts management subcommands")
132
- layouts_app.command("launch")(launch)
133
- layouts_app.command("load-balance")(load_balance)
134
- return layouts_app()
132
+ layouts_app.command("run")(launch)
133
+ layouts_app.command("balance-load")(balance_load)
134
+ import sys
135
+ if len(sys.argv) == 1:
136
+ layouts_app(["--help"])
137
+ else:
138
+ layouts_app()
135
139
 
136
140
 
137
141
  if __name__ == "__main__":
@@ -30,7 +30,7 @@ exclude = [
30
30
  ]
31
31
 
32
32
  # Same as Black.
33
- line-length = 250
33
+ line-length = 350
34
34
  indent-width = 4
35
35
 
36
36
  # Assume Python 3.13
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: machineconfig
3
- Version: 4.91
3
+ Version: 4.93
4
4
  Summary: Dotfiles management package
5
5
  Author-email: Alex Al-Saffar <programmer@usa.com>
6
6
  License: Apache 2.0
@@ -139,7 +139,7 @@ machineconfig/scripts/linux/warp-cli.sh,sha256=shFFZ9viet_DSEEHT8kxlGRHoJpO6o85p
139
139
  machineconfig/scripts/linux/wifi_conn,sha256=X4TH3OvcVZfOveSbF9WW8uXb4U_G7ZSnCERc7VYAqkc,95
140
140
  machineconfig/scripts/linux/z_ls,sha256=ATZtu0ccN3AKvAOxkwLq1xgQjJ3en5byEWJ3Q8afnNg,3340
141
141
  machineconfig/scripts/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
- machineconfig/scripts/python/agents.py,sha256=RtRR53Mt3zTqHqJbS5nY7XHRbZPty8hPl1mpgKAvaME,9832
142
+ machineconfig/scripts/python/agents.py,sha256=iMR-lpkdIzpm1CEin092IRCq2RbXLD-8Z_SOcV0g33Q,9897
143
143
  machineconfig/scripts/python/choose_wezterm_theme.py,sha256=Hlu_EOQhLM6wYdAdY25jcqEK11BkVwQYwkz04xnIBVU,3397
144
144
  machineconfig/scripts/python/cloud_copy.py,sha256=_pxA8o3ar5vH9DkrAdwafHcZMiqNCbY_IfNzKCOMJ5k,8395
145
145
  machineconfig/scripts/python/cloud_manager.py,sha256=YN0DYLzPKtMBaks-EAVwFmkCu3XeHWMr1D21uqX5dDk,3429
@@ -151,15 +151,15 @@ machineconfig/scripts/python/devops.py,sha256=fTEut6gTDfmNqzS8-gRyRAsmWJYPGGIt8X
151
151
  machineconfig/scripts/python/devops_add_identity.py,sha256=JfN3ZrYMCgmt4ks_VCfnV9BIIHAsOYO3E0W0wZ15FR8,3791
152
152
  machineconfig/scripts/python/devops_add_ssh_key.py,sha256=KaoX83KltBsmutfKhSfZjd7nP_R1hJ2OLAWRhbswO7o,6889
153
153
  machineconfig/scripts/python/devops_backup_retrieve.py,sha256=jZe5Vki7E2GCMG8hvqUZeOONFC4cNzISoGzq_dMG4GA,5601
154
- machineconfig/scripts/python/devops_devapps_install.py,sha256=f22pUQQjY0AGs4jjxSgYz1e0LOfZGXucTH1lmgQa5Vw,10233
154
+ machineconfig/scripts/python/devops_devapps_install.py,sha256=U3Kl8QCHKmQg3o7c2IRsmFM25fGMX1CoH9wvkf2tdeU,10234
155
155
  machineconfig/scripts/python/devops_update_repos.py,sha256=c5qBc9cuTGDEqDHufkjDT4d_vvJsswv3tlqk9MAulYk,8063
156
156
  machineconfig/scripts/python/dotfile.py,sha256=SRcX-9Ak1jRvF-killBTTm2IWcsNxfiLucH6ZsytAFA,2202
157
157
  machineconfig/scripts/python/fire_agents_help_launch.py,sha256=1ymWiszfjCyPv3ofinWzfOmbzLEt3d7ntac_afLh-V4,5017
158
158
  machineconfig/scripts/python/fire_agents_help_search.py,sha256=qIfSS_su2YJ1Gb0_lu4cbjlJlYMBw0v52NTGiSrGjk8,2991
159
159
  machineconfig/scripts/python/fire_agents_helper_types.py,sha256=zKu8Vr6iucaGSkCm_Tkt_WrYU7-6Nript3coYyzTXzY,295
160
160
  machineconfig/scripts/python/fire_agents_load_balancer.py,sha256=mpqx3uaQdBXYieuvhdK-qsvLepf9oIMo3pwPj9mSEDI,1079
161
- machineconfig/scripts/python/fire_jobs.py,sha256=7R4CO7wGRkG6akPLK6SMHr82_RdIeXIJNicCAdgh1ok,20262
162
- machineconfig/scripts/python/fire_jobs_args_helper.py,sha256=5zqnYvBjXSLFUqMHg5fgI62YnDu7CpVC4RLmXUKpI2I,2050
161
+ machineconfig/scripts/python/fire_jobs.py,sha256=bad66rJK0_hsSzInXpXp_R-eXNyDMRvVV14zA5nANMg,20271
162
+ machineconfig/scripts/python/fire_jobs_args_helper.py,sha256=VZIQ6ShZBt2WLcqa1fpl1419AGa0k7Xg-EzzrKpDIqw,4029
163
163
  machineconfig/scripts/python/fire_jobs_streamlit_helper.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
164
164
  machineconfig/scripts/python/ftpx.py,sha256=l_gdJS0QB2wVZErubtZvm4HJD9HZAJxSP68sbY73xwo,10278
165
165
  machineconfig/scripts/python/get_zellij_cmd.py,sha256=e35-18hoXM9N3PFbvbizfkNY_-63iMicieWE3TbGcCQ,576
@@ -170,13 +170,13 @@ machineconfig/scripts/python/mount_nw_drive.py,sha256=iru6AtnTyvyuk6WxlK5R4lDkul
170
170
  machineconfig/scripts/python/mount_ssh.py,sha256=rGY2pgtlnWMi0Rrge1aCdjtfbULrj2cyaStDoX-y2w4,2236
171
171
  machineconfig/scripts/python/onetimeshare.py,sha256=bmGsNnskym5OWfIhpOfZG5jq3m89FS0a6dF5Sb8LaZM,2539
172
172
  machineconfig/scripts/python/pomodoro.py,sha256=SPkfeoZGv8rylGiOyzQ7UK3aXZ3G2FIOuGkSuBUggOI,2019
173
- machineconfig/scripts/python/repos.py,sha256=8NWNUCZKMjs_C36P2FpVhj3_11CsbdASqaAc-VCOYQo,4226
173
+ machineconfig/scripts/python/repos.py,sha256=Mz-d0ubynOZaKwC6YXKiZq9ojMnKFi4J6n0UbiJYZyY,4449
174
174
  machineconfig/scripts/python/repos_helper_action.py,sha256=f0vFjPj9WEA361961ux3SIEg9riVGHtyuf6BnO6lnvU,13336
175
175
  machineconfig/scripts/python/repos_helper_clone.py,sha256=xW5YZEoNt3k7h9NIULhUhOnh53-B63eiXF2FjOl1IKQ,5535
176
176
  machineconfig/scripts/python/repos_helper_record.py,sha256=YEEQORfEiLddOIIgePo5eEkyQUFruFg3kc8npMvRL-o,10927
177
177
  machineconfig/scripts/python/repos_helper_update.py,sha256=AYyKIB7eQ48yoYmFjydIhRI1lV39TBv_S4_LCa-oKuQ,11042
178
178
  machineconfig/scripts/python/scheduler.py,sha256=rKhssuxkD697EY6qaV6CSdNhxpAQLDWO4fE8GMCQ9FA,3061
179
- machineconfig/scripts/python/sessions.py,sha256=WT-WVmrYDe3u-4Gjjm_1Apq879qcOtM6TCR4Q-9JZys,8299
179
+ machineconfig/scripts/python/sessions.py,sha256=-pKyA3oOC8ynHNE8Rcos5w0OEDT6t1O81EZWJo-rOU0,8377
180
180
  machineconfig/scripts/python/share_terminal.py,sha256=biuG35YiknTMVr3Mzs4bBZwEq53JcuBRlzMTp6eY90M,5009
181
181
  machineconfig/scripts/python/snapshot.py,sha256=aDvKeoniZaeTSNv9zWBUajaj2yagAxVdfuvO1_tgq5Y,1026
182
182
  machineconfig/scripts/python/start_slidev.py,sha256=U5ujAL7R5Gd5CzFReTsnF2SThjY91aFBg0Qz_MMl6U4,4573
@@ -306,7 +306,7 @@ machineconfig/settings/lf/windows/autocall/rename.ps1,sha256=47DEQpj8HBSa-_TImW-
306
306
  machineconfig/settings/linters/.flake8,sha256=1By04Qwy5saCudYKOw2bKHSNQg4N128SJudwD3SVGhQ,1958
307
307
  machineconfig/settings/linters/.mypy.ini,sha256=BNxVtNuliJZVeFpCRRIQpSWFDQYuKqKtcVKYcZ-sApc,811
308
308
  machineconfig/settings/linters/.pylintrc,sha256=_hYrPgtMvQc877u5NTU_HlkJMZwuDrmB6Yt3u5zg3-c,3593
309
- machineconfig/settings/linters/.ruff.toml,sha256=CiLFhFLJzQc1UvJF2ecRjO4hjmC_xx9j0JCKHKi-po8,1655
309
+ machineconfig/settings/linters/.ruff.toml,sha256=5C-8Fkj9mdZxs3ajeideTNUOKRSo31dDYW1VQmDzK6w,1655
310
310
  machineconfig/settings/lvim/linux/config.lua,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
311
311
  machineconfig/settings/lvim/windows/config.lua,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
312
312
  machineconfig/settings/lvim/windows/archive/config_additional.lua,sha256=zj-VDn-Av4IomJ3EqM1gf_6VsZ9ieG815O9QK1slyPI,792
@@ -404,8 +404,8 @@ machineconfig/utils/schemas/fire_agents/fire_agents_input.py,sha256=pTxvLzIpD5RF
404
404
  machineconfig/utils/schemas/installer/installer_types.py,sha256=QClRY61QaduBPJoSpdmTIdgS9LS-RvE-QZ-D260tD3o,1214
405
405
  machineconfig/utils/schemas/layouts/layout_types.py,sha256=TcqlZdGVoH8htG5fHn1KWXhRdPueAcoyApppZsPAPto,2020
406
406
  machineconfig/utils/schemas/repos/repos_types.py,sha256=ECVr-3IVIo8yjmYmVXX2mnDDN1SLSwvQIhx4KDDQHBQ,405
407
- machineconfig-4.91.dist-info/METADATA,sha256=6itSuVawfwaAdJH3RfxSZVJddeSL434HDZ20XU63PBk,7061
408
- machineconfig-4.91.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
409
- machineconfig-4.91.dist-info/entry_points.txt,sha256=LcwklRJPY_uKBvStgtOJn5G_pmFCEdpgRNzUUc6twAQ,1134
410
- machineconfig-4.91.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
411
- machineconfig-4.91.dist-info/RECORD,,
407
+ machineconfig-4.93.dist-info/METADATA,sha256=04GF2cymQW0SDxwA0oGIroHpIP-TFvPJyz6zmgaCTrI,7061
408
+ machineconfig-4.93.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
409
+ machineconfig-4.93.dist-info/entry_points.txt,sha256=LcwklRJPY_uKBvStgtOJn5G_pmFCEdpgRNzUUc6twAQ,1134
410
+ machineconfig-4.93.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
411
+ machineconfig-4.93.dist-info/RECORD,,