dh-cli 0.2.2__tar.gz → 0.2.3__tar.gz

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.
Files changed (40) hide show
  1. {dh_cli-0.2.2 → dh_cli-0.2.3}/PKG-INFO +1 -1
  2. {dh_cli-0.2.2 → dh_cli-0.2.3}/pyproject.toml +1 -1
  3. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/engines_studios/engine_commands.py +23 -2
  4. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/engines_studios/studio_commands.py +24 -4
  5. {dh_cli-0.2.2 → dh_cli-0.2.3}/.gitignore +0 -0
  6. {dh_cli-0.2.2 → dh_cli-0.2.3}/LICENSE +0 -0
  7. {dh_cli-0.2.2 → dh_cli-0.2.3}/README.md +0 -0
  8. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/__init__.py +0 -0
  9. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/__init__.py +0 -0
  10. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/aws_batch.py +0 -0
  11. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/commands/__init__.py +0 -0
  12. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/commands/boltz.py +0 -0
  13. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/commands/cancel.py +0 -0
  14. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/commands/clean.py +0 -0
  15. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/commands/embed_t5.py +0 -0
  16. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/commands/finalize.py +0 -0
  17. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/commands/list_jobs.py +0 -0
  18. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/commands/local.py +0 -0
  19. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/commands/logs.py +0 -0
  20. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/commands/retry.py +0 -0
  21. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/commands/status.py +0 -0
  22. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/commands/submit.py +0 -0
  23. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/commands/train.py +0 -0
  24. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/commands/wait_for.py +0 -0
  25. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/fasta_utils.py +0 -0
  26. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/h5_utils.py +0 -0
  27. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/job_id.py +0 -0
  28. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/manifest.py +0 -0
  29. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/batch/s3_transport.py +0 -0
  30. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/cloud_commands.py +0 -0
  31. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/codeartifact.py +0 -0
  32. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/engines_studios/__init__.py +0 -0
  33. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/engines_studios/api_client.py +0 -0
  34. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/engines_studios/auth.py +0 -0
  35. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/engines_studios/progress.py +0 -0
  36. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/engines_studios/ssh_config.py +0 -0
  37. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/github_commands.py +0 -0
  38. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/main.py +0 -0
  39. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/utility_commands.py +0 -0
  40. {dh_cli-0.2.2 → dh_cli-0.2.3}/src/dh_cli/warehouse.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dh-cli
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: Dayhoff Labs developer CLI
5
5
  Author-email: Dayhoff Labs <dev@dayhofflabs.com>
6
6
  License: # PolyForm Noncommercial License 1.0.0
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "dh-cli"
7
- version = "0.2.2"
7
+ version = "0.2.3"
8
8
  description = "Dayhoff Labs developer CLI"
9
9
  requires-python = ">=3.11"
10
10
  readme = "README.md"
@@ -616,6 +616,7 @@ def list_engines(env: Optional[str]):
616
616
  state_width = 12
617
617
  user_width = 12
618
618
  type_width = 12
619
+ disk_width = 14
619
620
  id_width = 20
620
621
 
621
622
  # Table top border
@@ -629,13 +630,15 @@ def list_engines(env: Optional[str]):
629
630
  + "┬"
630
631
  + "─" * (type_width + 1)
631
632
  + "┬"
633
+ + "─" * (disk_width + 1)
634
+ + "┬"
632
635
  + "─" * (id_width + 1)
633
636
  + "╮"
634
637
  )
635
638
 
636
639
  # Table header
637
640
  click.echo(
638
- f"│ {'Name':<{name_width}}│ {'State':<{state_width}}│ {'User':<{user_width}}│ {'Type':<{type_width}}│ {'Instance ID':<{id_width}}│"
641
+ f"│ {'Name':<{name_width}}│ {'State':<{state_width}}│ {'User':<{user_width}}│ {'Type':<{type_width}}│ {'Disk':>{disk_width}}│ {'Instance ID':<{id_width}}│"
639
642
  )
640
643
 
641
644
  # Header separator
@@ -649,6 +652,8 @@ def list_engines(env: Optional[str]):
649
652
  + "┼"
650
653
  + "─" * (type_width + 1)
651
654
  + "┼"
655
+ + "─" * (disk_width + 1)
656
+ + "┼"
652
657
  + "─" * (id_width + 1)
653
658
  + "┤"
654
659
  )
@@ -685,8 +690,22 @@ def list_engines(env: Optional[str]):
685
690
  # Color the instance ID (grey)
686
691
  instance_id_display = f"\033[90m{instance_id:<{id_width}}\033[0m"
687
692
 
693
+ # Color the disk usage
694
+ usage_pct = engine.get("boot_disk_usage_pct")
695
+ total_gb = engine.get("boot_disk_total_gb")
696
+ if usage_pct is not None and total_gb is not None:
697
+ disk_text = f"{usage_pct}% of {total_gb}G"
698
+ if usage_pct >= 90:
699
+ disk_display = f"\033[31m{disk_text:>{disk_width}}\033[0m"
700
+ elif usage_pct >= 70:
701
+ disk_display = f"\033[33m{disk_text:>{disk_width}}\033[0m"
702
+ else:
703
+ disk_display = f"\033[32m{disk_text:>{disk_width}}\033[0m"
704
+ else:
705
+ disk_display = f"\033[90m{'-':>{disk_width}}\033[0m"
706
+
688
707
  click.echo(
689
- f"│ {name_display}│ {state_display}│ {user:<{user_width}}│ {engine_type:<{type_width}}│ {instance_id_display}│"
708
+ f"│ {name_display}│ {state_display}│ {user:<{user_width}}│ {engine_type:<{type_width}}│ {disk_display}│ {instance_id_display}│"
690
709
  )
691
710
 
692
711
  # Table bottom border
@@ -700,6 +719,8 @@ def list_engines(env: Optional[str]):
700
719
  + "┴"
701
720
  + "─" * (type_width + 1)
702
721
  + "┴"
722
+ + "─" * (disk_width + 1)
723
+ + "┴"
703
724
  + "─" * (id_width + 1)
704
725
  + "╯"
705
726
  )
@@ -299,9 +299,10 @@ def list_studios(env: Optional[str]):
299
299
  max_attached_len + 2, len("Attached To") + 2, 3
300
300
  ) # At least 3 for "-"
301
301
 
302
- # Fixed widths for other columns - reordered to [User, Status, Attached To, Size, Studio ID]
302
+ # Fixed widths for other columns - reordered to [User, Status, Attached To, Size, Usage, Studio ID]
303
303
  status_width = 12
304
304
  size_width = 10
305
+ usage_width = 8
305
306
  id_width = 25
306
307
 
307
308
  # Table top border
@@ -315,13 +316,15 @@ def list_studios(env: Optional[str]):
315
316
  + "┬"
316
317
  + "─" * (size_width + 1)
317
318
  + "┬"
319
+ + "─" * (usage_width + 1)
320
+ + "┬"
318
321
  + "─" * (id_width + 1)
319
322
  + "╮"
320
323
  )
321
324
 
322
- # Table header - reordered to [User, Status, Attached To, Size, Studio ID]
325
+ # Table header - reordered to [User, Status, Attached To, Size, Usage, Studio ID]
323
326
  click.echo(
324
- f"│ {'User':<{user_width}}│ {'Status':<{status_width}}│ {'Attached To':<{attached_width}}│ {'Size':<{size_width}}│ {'Studio ID':<{id_width}}│"
327
+ f"│ {'User':<{user_width}}│ {'Status':<{status_width}}│ {'Attached To':<{attached_width}}│ {'Size':<{size_width}}│ {'Usage':>{usage_width}}│ {'Studio ID':<{id_width}}│"
325
328
  )
326
329
 
327
330
  # Header separator
@@ -335,6 +338,8 @@ def list_studios(env: Optional[str]):
335
338
  + "┼"
336
339
  + "─" * (size_width + 1)
337
340
  + "┼"
341
+ + "─" * (usage_width + 1)
342
+ + "┼"
338
343
  + "─" * (id_width + 1)
339
344
  + "┤"
340
345
  )
@@ -387,8 +392,21 @@ def list_studios(env: Optional[str]):
387
392
  # Color the studio ID (grey)
388
393
  studio_id_display = f"\033[90m{studio_id:<{id_width}}\033[0m"
389
394
 
395
+ # Format usage percentage
396
+ usage_pct = studio.get("usage_pct")
397
+ if usage_pct is not None:
398
+ usage_text = f"{usage_pct}%"
399
+ if usage_pct >= 90:
400
+ usage_display = f"\033[31m{usage_text:>{usage_width}}\033[0m"
401
+ elif usage_pct >= 70:
402
+ usage_display = f"\033[33m{usage_text:>{usage_width}}\033[0m"
403
+ else:
404
+ usage_display = f"\033[32m{usage_text:>{usage_width}}\033[0m"
405
+ else:
406
+ usage_display = f"\033[90m{'-':>{usage_width}}\033[0m"
407
+
390
408
  click.echo(
391
- f"│ {user_display}│ {status_display}│ {attached_display}│ {size:<{size_width}}│ {studio_id_display}│"
409
+ f"│ {user_display}│ {status_display}│ {attached_display}│ {size:<{size_width}}│ {usage_display}│ {studio_id_display}│"
392
410
  )
393
411
 
394
412
  # Table bottom border
@@ -402,6 +420,8 @@ def list_studios(env: Optional[str]):
402
420
  + "┴"
403
421
  + "─" * (size_width + 1)
404
422
  + "┴"
423
+ + "─" * (usage_width + 1)
424
+ + "┴"
405
425
  + "─" * (id_width + 1)
406
426
  + "╯"
407
427
  )
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes