comfygit 0.3.22__tar.gz → 0.4.1__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 (89) hide show
  1. {comfygit-0.3.22 → comfygit-0.4.1}/PKG-INFO +7 -4
  2. {comfygit-0.3.22 → comfygit-0.4.1}/README.md +3 -2
  3. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/cli.py +253 -0
  4. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/env_commands.py +487 -14
  5. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/global_commands.py +379 -62
  6. comfygit-0.4.1/comfygit_cli/serve_executor.py +1000 -0
  7. comfygit-0.4.1/comfygit_cli/serve_runtime.py +2948 -0
  8. comfygit-0.4.1/comfygit_cli/serve_state.py +905 -0
  9. comfygit-0.4.1/comfygit_cli/studio_static/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
  10. comfygit-0.4.1/comfygit_cli/studio_static/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
  11. comfygit-0.4.1/comfygit_cli/studio_static/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
  12. comfygit-0.4.1/comfygit_cli/studio_static/assets/index-AxBlFaca.js +17 -0
  13. comfygit-0.4.1/comfygit_cli/studio_static/assets/index-BDmIh9tA.css +1 -0
  14. comfygit-0.4.1/comfygit_cli/studio_static/index.html +14 -0
  15. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/utils/orchestrator.py +7 -10
  16. {comfygit-0.3.22 → comfygit-0.4.1}/pyproject.toml +13 -3
  17. comfygit-0.3.22/.github/workflows/publish_pypi.yml +0 -56
  18. comfygit-0.3.22/.python-version +0 -1
  19. comfygit-0.3.22/CLAUDE.md +0 -103
  20. comfygit-0.3.22/docs/architecture.md +0 -145
  21. comfygit-0.3.22/scripts/README_REGISTRY.md +0 -130
  22. comfygit-0.3.22/scripts/augment_mappings.py +0 -381
  23. comfygit-0.3.22/scripts/build_global_mappings.py +0 -275
  24. comfygit-0.3.22/scripts/build_registry_cache.py +0 -659
  25. comfygit-0.3.22/scripts/extract_builtin_nodes.py +0 -546
  26. comfygit-0.3.22/scripts/extract_node_modules.py +0 -77
  27. comfygit-0.3.22/scripts/get_hash.py +0 -86
  28. comfygit-0.3.22/scripts/global-node-mappings.md +0 -299
  29. comfygit-0.3.22/scripts/registry.py +0 -547
  30. comfygit-0.3.22/scripts/registry_client.py +0 -184
  31. comfygit-0.3.22/scripts/test_concurrent_api.py +0 -318
  32. comfygit-0.3.22/tests/conftest.py +0 -37
  33. comfygit-0.3.22/tests/test_batch_node_add.py +0 -195
  34. comfygit-0.3.22/tests/test_batch_node_remove.py +0 -225
  35. comfygit-0.3.22/tests/test_branch_commands.py +0 -466
  36. comfygit-0.3.22/tests/test_completers.py +0 -436
  37. comfygit-0.3.22/tests/test_completion_commands.py +0 -301
  38. comfygit-0.3.22/tests/test_conflict_resolver.py +0 -218
  39. comfygit-0.3.22/tests/test_detached_head_display.py +0 -157
  40. comfygit-0.3.22/tests/test_doctor_command.py +0 -99
  41. comfygit-0.3.22/tests/test_error_formatter.py +0 -173
  42. comfygit-0.3.22/tests/test_log_command.py +0 -178
  43. comfygit-0.3.22/tests/test_logging_structure.py +0 -199
  44. comfygit-0.3.22/tests/test_manager_commands.py +0 -342
  45. comfygit-0.3.22/tests/test_manifest_command.py +0 -187
  46. comfygit-0.3.22/tests/test_no_manager_flags.py +0 -76
  47. comfygit-0.3.22/tests/test_overlay_commands.py +0 -137
  48. comfygit-0.3.22/tests/test_pagination.py +0 -72
  49. comfygit-0.3.22/tests/test_preview_display.py +0 -276
  50. comfygit-0.3.22/tests/test_py_commands.py +0 -883
  51. comfygit-0.3.22/tests/test_py_remove_group_commands.py +0 -140
  52. comfygit-0.3.22/tests/test_status_disabled_nodes_display.py +0 -94
  53. comfygit-0.3.22/tests/test_status_displays_uninstalled_nodes.py +0 -179
  54. comfygit-0.3.22/tests/test_status_path_sync_display.py +0 -92
  55. comfygit-0.3.22/tests/test_status_real_bug_scenario.py +0 -135
  56. comfygit-0.3.22/tests/test_status_suggestions.py +0 -137
  57. comfygit-0.3.22/tests/test_status_uninstalled_reporting.py +0 -62
  58. comfygit-0.3.22/tests/test_torch_backend_cli.py +0 -355
  59. comfygit-0.3.22/tests/test_update_checker.py +0 -71
  60. comfygit-0.3.22/tests/test_update_command.py +0 -51
  61. comfygit-0.3.22/tests/test_update_notice.py +0 -84
  62. comfygit-0.3.22/tests/test_update_workflow_model_paths.py +0 -189
  63. comfygit-0.3.22/tests/test_workflow_model_importance.py +0 -210
  64. {comfygit-0.3.22 → comfygit-0.4.1}/.gitignore +0 -0
  65. {comfygit-0.3.22 → comfygit-0.4.1}/LICENSE.txt +0 -0
  66. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/__init__.py +0 -0
  67. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/__main__.py +0 -0
  68. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/cli_utils.py +0 -0
  69. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/completers.py +0 -0
  70. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/completion_commands.py +0 -0
  71. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/formatters/__init__.py +0 -0
  72. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/formatters/error_formatter.py +0 -0
  73. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/interactive/__init__.py +0 -0
  74. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/logging/compressed_handler.py +0 -0
  75. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/logging/environment_logger.py +0 -0
  76. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/logging/log_compressor.py +0 -0
  77. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/logging/logging_config.py +0 -0
  78. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/resolution_strategies.py +0 -0
  79. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/strategies/__init__.py +0 -0
  80. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/strategies/conflict_resolver.py +0 -0
  81. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/strategies/interactive.py +0 -0
  82. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/strategies/rollback.py +0 -0
  83. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/update_commands.py +0 -0
  84. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/utils/__init__.py +0 -0
  85. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/utils/civitai_errors.py +0 -0
  86. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/utils/pagination.py +0 -0
  87. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/utils/progress.py +0 -0
  88. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/utils/update_checker.py +0 -0
  89. {comfygit-0.3.22 → comfygit-0.4.1}/comfygit_cli/utils/update_notice.py +0 -0
@@ -1,14 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: comfygit
3
- Version: 0.3.22
3
+ Version: 0.4.1
4
4
  Summary: ComfyGit - Git-based environment management for ComfyUI
5
5
  Project-URL: Documentation, https://docs.comfygit.org/
6
6
  Project-URL: Repository, https://github.com/comfygit-ai/comfygit
7
7
  Project-URL: Issues, https://github.com/comfygit-ai/comfygit/issues
8
8
  License-File: LICENSE.txt
9
9
  Requires-Python: >=3.10
10
+ Requires-Dist: aiohttp>=3.13.4
10
11
  Requires-Dist: argcomplete>=3.5.0
11
- Requires-Dist: comfygit-core==0.3.22
12
+ Requires-Dist: comfygit-core==0.4.1
13
+ Requires-Dist: requests>=2.33.0
12
14
  Description-Content-Type: text/markdown
13
15
 
14
16
  # ComfyGit CLI
@@ -663,9 +665,10 @@ See [packages/core/README.md](../core/README.md) for core library documentation.
663
665
 
664
666
  ## Contributing
665
667
 
666
- This is a MVP project run by a single developer. Contributions welcome!
668
+ This is a MVP project run by a single developer. Contributions welcome.
667
669
 
668
- **Note:** Contributors must sign our [Contributor License Agreement](../../CLA.md) to enable dual-licensing. See [CONTRIBUTING.md](../../CONTRIBUTING.md) for details.
670
+ Contributions are licensed under the repository's GPL-3.0 license. See
671
+ [CONTRIBUTING.md](../../CONTRIBUTING.md) for details.
669
672
 
670
673
  **Adding a new command:**
671
674
  1. Add command parser in `cli.py` (`_add_global_commands` or `_add_env_commands`)
@@ -650,9 +650,10 @@ See [packages/core/README.md](../core/README.md) for core library documentation.
650
650
 
651
651
  ## Contributing
652
652
 
653
- This is a MVP project run by a single developer. Contributions welcome!
653
+ This is a MVP project run by a single developer. Contributions welcome.
654
654
 
655
- **Note:** Contributors must sign our [Contributor License Agreement](../../CLA.md) to enable dual-licensing. See [CONTRIBUTING.md](../../CONTRIBUTING.md) for details.
655
+ Contributions are licensed under the repository's GPL-3.0 license. See
656
+ [CONTRIBUTING.md](../../CONTRIBUTING.md) for details.
656
657
 
657
658
  **Adding a new command:**
658
659
  1. Add command parser in `cli.py` (`_add_global_commands` or `_add_env_commands`)
@@ -179,6 +179,42 @@ def _add_global_commands(subparsers: argparse._SubParsersAction) -> None:
179
179
  list_parser = subparsers.add_parser("list", help="List all environments")
180
180
  list_parser.set_defaults(func=global_cmds.list_envs)
181
181
 
182
+ # analyze - Analyze a workflow file without requiring workspace/env
183
+ analyze_parser = subparsers.add_parser(
184
+ "analyze",
185
+ help="Analyze a workflow file for dependencies",
186
+ )
187
+ analyze_parser.add_argument("workflow", type=Path, help="Path to workflow JSON file")
188
+ analyze_parser.add_argument(
189
+ "--json",
190
+ action="store_true",
191
+ dest="json_output",
192
+ help="Output as JSON",
193
+ )
194
+ analyze_parser.add_argument(
195
+ "--draft-spec",
196
+ action="store_true",
197
+ help="Output draft pyproject.toml",
198
+ )
199
+ analyze_parser.add_argument(
200
+ "--online",
201
+ action="store_true",
202
+ help="Enrich model sources using online provider lookups",
203
+ )
204
+ analyze_parser.add_argument(
205
+ "--verbose",
206
+ "-v",
207
+ action="store_true",
208
+ help="Show detailed provenance",
209
+ )
210
+ analyze_parser.add_argument(
211
+ "--quiet",
212
+ "-q",
213
+ action="store_true",
214
+ help="Only show unresolved items",
215
+ )
216
+ analyze_parser.set_defaults(func=global_cmds.analyze)
217
+
182
218
  # update - Update ComfyGit CLI (self-update)
183
219
  update_parser = subparsers.add_parser("update", help="Update ComfyGit CLI")
184
220
  update_parser.add_argument("--check", action="store_true", help="Check for updates without upgrading")
@@ -220,6 +256,41 @@ def _add_global_commands(subparsers: argparse._SubParsersAction) -> None:
220
256
  import_parser.add_argument("-y", "--yes", action="store_true", help="Skip confirmation prompts, use defaults for workspace initialization")
221
257
  import_parser.set_defaults(func=global_cmds.import_env)
222
258
 
259
+ # materialize - Hydrate a portable environment for headless runtime/build use
260
+ materialize_parser = subparsers.add_parser(
261
+ "materialize",
262
+ help="Materialize a ComfyGit environment from a directory, tarball, or git URL",
263
+ )
264
+ materialize_parser.add_argument("source", type=str, help="Source directory, .tar.gz bundle, or git repository URL")
265
+ materialize_parser.add_argument("--name", type=str, required=True, help="Name for the materialized environment")
266
+ materialize_parser.add_argument("--workspace", type=Path, help="Workspace path to create/use")
267
+ materialize_parser.add_argument("--models-dir", type=Path, help="Global model directory for the workspace")
268
+ materialize_parser.add_argument("--branch", "-b", type=str, help="Git branch, tag, or commit to materialize")
269
+ materialize_parser.add_argument(
270
+ "--torch-backend",
271
+ default="auto",
272
+ metavar="BACKEND",
273
+ help=(
274
+ "PyTorch backend. Examples: auto (detect GPU), cpu, "
275
+ "cu128 (CUDA 12.8), cu126, cu124, rocm6.3 (AMD), xpu (Intel). "
276
+ "Default: auto"
277
+ ),
278
+ )
279
+ materialize_parser.add_argument(
280
+ "--models",
281
+ choices=["all", "required", "skip"],
282
+ default="skip",
283
+ help="Model download strategy. Default: skip",
284
+ )
285
+ materialize_parser.add_argument(
286
+ "--with-manager",
287
+ action="store_true",
288
+ help="Install/register comfygit-manager during materialization",
289
+ )
290
+ materialize_parser.add_argument("--use", action="store_true", help="Set materialized environment as active")
291
+ materialize_parser.add_argument("--replace", action="store_true", help="Replace an existing environment with the same name")
292
+ materialize_parser.set_defaults(func=global_cmds.materialize_env)
293
+
223
294
  # export - Export ComfyGit environment
224
295
  export_parser = subparsers.add_parser("export", help="Export ComfyGit environment (include relevant files from .cec)")
225
296
  export_parser.add_argument("path", type=Path, nargs="?", help="Path to output file")
@@ -278,6 +349,12 @@ def _add_global_commands(subparsers: argparse._SubParsersAction) -> None:
278
349
  model_add_source_parser.add_argument("url", nargs="?", help="Download URL")
279
350
  model_add_source_parser.set_defaults(func=global_cmds.model_add_source)
280
351
 
352
+ # model delete
353
+ model_delete_parser = model_subparsers.add_parser("delete", help="Delete model files and clean index entries")
354
+ model_delete_parser.add_argument("identifier", help="Model hash, hash prefix, filename, or path")
355
+ model_delete_parser.add_argument("-y", "--yes", action="store_true", help="Skip confirmation prompt")
356
+ model_delete_parser.set_defaults(func=global_cmds.model_delete)
357
+
281
358
  # Registry management subcommands
282
359
  registry_parser = subparsers.add_parser("registry", help="Manage node registry cache")
283
360
  registry_subparsers = registry_parser.add_subparsers(dest="registry_command", help="Registry commands")
@@ -297,6 +374,7 @@ def _add_global_commands(subparsers: argparse._SubParsersAction) -> None:
297
374
 
298
375
  # Legacy flags - still supported at root level for backward compatibility
299
376
  config_parser.add_argument("--civitai-key", type=str, help="Set Civitai API key (use empty string to clear)")
377
+ config_parser.add_argument("--github-token", type=str, help="Set GitHub token for private git repository access (use empty string to clear)")
300
378
  config_parser.add_argument("--uv-cache", type=str, help="Set external UV cache path (use empty string to clear)")
301
379
  config_parser.add_argument("--show", action="store_true", help="Show current configuration")
302
380
  config_parser.set_defaults(func=global_cmds.config)
@@ -542,6 +620,91 @@ def _add_env_commands(subparsers: argparse._SubParsersAction) -> None:
542
620
  )
543
621
  run_parser.set_defaults(func=env_cmds.run, args=[])
544
622
 
623
+ # serve - Front a running ComfyUI instance with contract-shaped endpoints
624
+ serve_parser = subparsers.add_parser(
625
+ "serve",
626
+ help="Serve workflow contracts for this environment",
627
+ )
628
+ serve_parser.add_argument(
629
+ "--host",
630
+ default="127.0.0.1",
631
+ help="Host/interface to bind (default: 127.0.0.1)",
632
+ )
633
+ serve_parser.add_argument(
634
+ "--port",
635
+ type=int,
636
+ default=8190,
637
+ help="Port to bind (default: 8190)",
638
+ )
639
+ serve_parser.add_argument(
640
+ "--comfy-url",
641
+ default="http://127.0.0.1:8188",
642
+ help="Running ComfyUI API URL (default: http://127.0.0.1:8188)",
643
+ )
644
+ serve_parser.add_argument(
645
+ "--role",
646
+ choices=["studio", "proxy"],
647
+ default="studio",
648
+ help="Serve role: studio front door or compute-only proxy runtime (default: studio)",
649
+ )
650
+ serve_parser.add_argument(
651
+ "--executor",
652
+ choices=["local", "proxy"],
653
+ default="local",
654
+ help="Execution adapter for studio role (default: local)",
655
+ )
656
+ serve_parser.add_argument(
657
+ "--proxy-url",
658
+ help="Proxy runtime base URL when --executor proxy is used",
659
+ )
660
+ serve_parser.add_argument(
661
+ "--proxy-token",
662
+ help="Bearer token shared by proxy front door and proxy runtime",
663
+ )
664
+ serve_parser.add_argument(
665
+ "--callback-url",
666
+ help="Browser/coordinator-reachable base URL that proxy workers call back after async runs",
667
+ )
668
+ serve_parser.add_argument(
669
+ "--callback-token",
670
+ help="Bearer token accepted by the front door worker-callback endpoint (defaults to --proxy-token)",
671
+ )
672
+ serve_parser.add_argument(
673
+ "--artifact-dir",
674
+ type=Path,
675
+ help="Directory for localized proxy artifacts (default: <workspace>/.metadata/serve/artifacts)",
676
+ )
677
+ serve_parser.add_argument(
678
+ "--max-request-mb",
679
+ type=int,
680
+ default=256,
681
+ help="Maximum contract request body size in MiB (default: 256)",
682
+ )
683
+ serve_parser.add_argument(
684
+ "--run-timeout-seconds",
685
+ type=float,
686
+ default=12 * 60 * 60,
687
+ help="Maximum background run wait time in seconds (default: 43200)",
688
+ )
689
+ serve_parser.add_argument(
690
+ "--state",
691
+ choices=["ephemeral", "local"],
692
+ default="ephemeral",
693
+ help="Serve runtime state adapter (default: ephemeral)",
694
+ )
695
+ serve_parser.add_argument(
696
+ "--gallery",
697
+ choices=["private", "shared"],
698
+ default="private",
699
+ help="Gallery visibility policy for serve state (default: private)",
700
+ )
701
+ serve_parser.add_argument(
702
+ "--state-db",
703
+ type=Path,
704
+ help="SQLite database path for --state local (default: <workspace>/.metadata/serve/serve.sqlite)",
705
+ )
706
+ serve_parser.set_defaults(func=env_cmds.serve)
707
+
545
708
  # status - Show environment status
546
709
  status_parser = subparsers.add_parser("status", help="Show status (both sync and git status)")
547
710
  status_parser.add_argument("-v", "--verbose", action="store_true", help="Show full details")
@@ -815,6 +978,37 @@ def _add_env_commands(subparsers: argparse._SubParsersAction) -> None:
815
978
  )
816
979
  node_add_parser.set_defaults(func=env_cmds.node_add)
817
980
 
981
+ # node dev-link
982
+ node_dev_link_parser = node_subparsers.add_parser(
983
+ "dev-link",
984
+ help="Link a tracked node to a local development checkout",
985
+ )
986
+ node_dev_link_parser.add_argument(
987
+ "node_name",
988
+ help="Existing node identifier/name, or identifier to use for a new dev node",
989
+ ).completer = installed_node_completer # type: ignore[attr-defined]
990
+ node_dev_link_parser.add_argument(
991
+ "--path",
992
+ required=True,
993
+ type=Path,
994
+ help="Path to the local custom-node development checkout",
995
+ )
996
+ node_dev_link_parser.add_argument(
997
+ "--name",
998
+ help="custom_nodes directory/symlink name to use when no tracked node exists",
999
+ )
1000
+ node_dev_link_parser.add_argument(
1001
+ "--replace-existing",
1002
+ action="store_true",
1003
+ help="Archive an existing materialized node directory and replace it with a symlink",
1004
+ )
1005
+ node_dev_link_parser.add_argument(
1006
+ "--force",
1007
+ action="store_true",
1008
+ help="Allow replacing an existing mismatched symlink or directory",
1009
+ )
1010
+ node_dev_link_parser.set_defaults(func=env_cmds.node_dev_link)
1011
+
818
1012
  # node remove
819
1013
  node_remove_parser = node_subparsers.add_parser("remove", help="Remove custom node(s)")
820
1014
  node_remove_parser.add_argument("node_names", nargs="+", help="Node registry ID(s) or name(s)").completer = installed_node_completer # type: ignore[attr-defined]
@@ -867,6 +1061,65 @@ def _add_env_commands(subparsers: argparse._SubParsersAction) -> None:
867
1061
  )
868
1062
  workflow_importance_parser.set_defaults(func=_make_help_func(workflow_importance_parser))
869
1063
 
1064
+ model_list_parser = workflow_model_subparsers.add_parser(
1065
+ "list",
1066
+ help="List models declared for a workflow"
1067
+ )
1068
+ model_list_parser.add_argument(
1069
+ "workflow_name",
1070
+ nargs="?",
1071
+ help="Workflow name (interactive if omitted)"
1072
+ ).completer = workflow_completer # type: ignore[attr-defined]
1073
+ model_list_parser.set_defaults(func=env_cmds.workflow_model_list)
1074
+
1075
+ model_add_parser = workflow_model_subparsers.add_parser(
1076
+ "add",
1077
+ help="Declare an indexed local model as required by a workflow"
1078
+ )
1079
+ model_add_parser.add_argument(
1080
+ "workflow_name",
1081
+ help="Workflow name"
1082
+ ).completer = workflow_completer # type: ignore[attr-defined]
1083
+ model_add_parser.add_argument(
1084
+ "--hash",
1085
+ dest="model_hash",
1086
+ help="Indexed model hash to attach"
1087
+ )
1088
+ model_add_parser.add_argument(
1089
+ "--path",
1090
+ dest="relative_path",
1091
+ help="Model path relative to the models directory, e.g. checkpoints/model.safetensors"
1092
+ )
1093
+ model_add_parser.add_argument(
1094
+ "--importance",
1095
+ "--criticality",
1096
+ dest="importance",
1097
+ default="required",
1098
+ choices=["required", "flexible", "optional"],
1099
+ help="Workflow dependency importance (default: required)"
1100
+ )
1101
+ model_add_parser.set_defaults(func=env_cmds.workflow_model_add)
1102
+
1103
+ model_remove_parser = workflow_model_subparsers.add_parser(
1104
+ "remove",
1105
+ help="Remove a manually declared workflow model"
1106
+ )
1107
+ model_remove_parser.add_argument(
1108
+ "workflow_name",
1109
+ help="Workflow name"
1110
+ ).completer = workflow_completer # type: ignore[attr-defined]
1111
+ model_remove_parser.add_argument(
1112
+ "--hash",
1113
+ dest="model_hash",
1114
+ help="Manual model hash to remove"
1115
+ )
1116
+ model_remove_parser.add_argument(
1117
+ "--path",
1118
+ dest="relative_path",
1119
+ help="Manual model path relative to the models directory"
1120
+ )
1121
+ model_remove_parser.set_defaults(func=env_cmds.workflow_model_remove)
1122
+
870
1123
  importance_parser = workflow_model_subparsers.add_parser(
871
1124
  "importance",
872
1125
  help="Set model importance (required/flexible/optional)"