ellf-cli 21.0.8__tar.gz → 21.0.9__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 (423) hide show
  1. {ellf_cli-21.0.8/ellf_cli.egg-info → ellf_cli-21.0.9}/PKG-INFO +1 -1
  2. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/README.md +4 -4
  3. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/_recipe_subcommand.py +49 -12
  4. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/actions.py +16 -6
  5. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/agents.py +16 -6
  6. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/services.py +16 -6
  7. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/tasks.py +16 -6
  8. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf.json +9 -9
  9. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/messages.py +0 -1
  10. ellf_cli-21.0.9/ellf_cli/recipes_cookiecutter/cookiecutter.json +11 -0
  11. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/.gitignore +0 -1
  12. ellf_cli-21.0.9/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/README.md.tmpl +78 -0
  13. ellf_cli-21.0.9/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements-dev.in +2 -0
  14. ellf_cli-21.0.9/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements.in +1 -0
  15. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/setup.py.tmpl +3 -2
  16. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/example_task.py +7 -3
  17. ellf_cli-21.0.9/ellf_cli/version/21.0.8_2026-10-29-13-48-18_patch_bdab3ee6-fba8-4625-9243-c4cbe839ba32 +3 -0
  18. {ellf_cli-21.0.8 → ellf_cli-21.0.9/ellf_cli.egg-info}/PKG-INFO +1 -1
  19. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli.egg-info/SOURCES.txt +3 -0
  20. ellf_cli-21.0.9/tests/test_recipe_help.py +75 -0
  21. ellf_cli-21.0.9/tests/test_recipes_init.py +49 -0
  22. ellf_cli-21.0.8/ellf_cli/recipes_cookiecutter/cookiecutter.json +0 -7
  23. ellf_cli-21.0.8/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/README.md.tmpl +0 -97
  24. ellf_cli-21.0.8/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements-dev.in +0 -8
  25. ellf_cli-21.0.8/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements.in +0 -1
  26. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/LICENSE +0 -0
  27. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/MANIFEST.in +0 -0
  28. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/__init__.py +0 -0
  29. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/__main__.py +0 -0
  30. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/about.json +0 -0
  31. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/about.py +0 -0
  32. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/agents.py +0 -0
  33. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/appdirs.py +0 -0
  34. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/auth.py +0 -0
  35. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/cli.py +0 -0
  36. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/cloud/__init__.py +0 -0
  37. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/cloud/gcp.py +0 -0
  38. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/cluster_config.py +0 -0
  39. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/__init__.py +0 -0
  40. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/_cluster_select.py +0 -0
  41. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/_org_select.py +0 -0
  42. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/_project_scope.py +0 -0
  43. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/_recipe_file.py +0 -0
  44. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/_state.py +0 -0
  45. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/_usage.py +0 -0
  46. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/assets.py +0 -0
  47. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/auth.py +0 -0
  48. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/clusters.py +0 -0
  49. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/config.py +0 -0
  50. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/datasets.py +0 -0
  51. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/files/__init__.py +0 -0
  52. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/files/cp.py +0 -0
  53. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/files/ls.py +0 -0
  54. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/files/rm.py +0 -0
  55. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/files/rsync.py +0 -0
  56. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/files/stats.py +0 -0
  57. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/general.py +0 -0
  58. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/import_export.py +0 -0
  59. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/infra/__init__.py +0 -0
  60. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/infra/_config_io.py +0 -0
  61. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/infra/_helpers.py +0 -0
  62. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/infra/configure.py +0 -0
  63. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/infra/deploy.py +0 -0
  64. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/infra/hibernate.py +0 -0
  65. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/infra/init.py +0 -0
  66. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/infra/init_values.py +0 -0
  67. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/infra/pause.py +0 -0
  68. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/infra/provision.py +0 -0
  69. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/infra/register.py +0 -0
  70. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/infra/setup.py +0 -0
  71. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/infra/start.py +0 -0
  72. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/infra/terraform.py +0 -0
  73. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/infra/tls.py +0 -0
  74. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/jobs.py +0 -0
  75. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/mcp.py +0 -0
  76. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/packages.py +0 -0
  77. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/paths.py +0 -0
  78. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/plans.py +0 -0
  79. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/projects.py +0 -0
  80. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/publish_code.py +0 -0
  81. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/publish_data.py +0 -0
  82. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/recipes.py +0 -0
  83. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/secrets.py +0 -0
  84. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/sessions.py +0 -0
  85. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/support.py +0 -0
  86. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/todos.py +0 -0
  87. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/commands/users.py +0 -0
  88. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/config.py +0 -0
  89. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/.gitignore +0 -0
  90. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/render.py +0 -0
  91. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.assistant.md +0 -0
  92. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.coding.md +0 -0
  93. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-annotate/references/annotation_audit.assistant.md +0 -0
  94. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-annotate/references/annotation_audit.coding.md +0 -0
  95. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_ellf_annotation_recipes.assistant.md +0 -0
  96. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_ellf_annotation_recipes.coding.md +0 -0
  97. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_prodigy_recipes.coding.md +0 -0
  98. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-annotate/references/label_schemes.assistant.md +0 -0
  99. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-annotate/references/label_schemes.coding.md +0 -0
  100. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-ask/SKILL.md +0 -0
  101. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-handoff/SKILL.assistant.md +0 -0
  102. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.assistant.md +0 -0
  103. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.coding.md +0 -0
  104. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-monitor/references/annotation_metrics.assistant.md +0 -0
  105. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-monitor/references/annotation_metrics.coding.md +0 -0
  106. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-monitor/references/training_monitoring.assistant.md +0 -0
  107. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-monitor/references/training_monitoring.coding.md +0 -0
  108. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-monitor/scripts.coding/check_training.py +0 -0
  109. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-ops/SKILL.assistant.md +0 -0
  110. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-ops/SKILL.coding.md +0 -0
  111. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-ops/references.coding/data_infra_cli.md +0 -0
  112. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-ops/scripts.coding/run_job.py +0 -0
  113. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-patterns/SKILL.coding.md +0 -0
  114. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-patterns/references/pattern_strategies.md +0 -0
  115. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/SKILL.coding.md +0 -0
  116. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_action_recipe.py +0 -0
  117. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_agent_recipe.py +0 -0
  118. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_blocks_ui.py +0 -0
  119. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_correct.py +0 -0
  120. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_custom_ui.py +0 -0
  121. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_manual.py +0 -0
  122. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_pages_ui.py +0 -0
  123. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_routing.py +0 -0
  124. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_service_recipe.py +0 -0
  125. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_task_recipe.py +0 -0
  126. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_teach.py +0 -0
  127. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/builtin_recipes.md +0 -0
  128. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/ellf_recipe_sdk.md +0 -0
  129. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/lint_recipe.py +0 -0
  130. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/prodigy_recipe_api.md +0 -0
  131. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/template_index.md +0 -0
  132. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-project/SKILL.assistant.md +0 -0
  133. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-project/SKILL.coding.md +0 -0
  134. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-project/references/annotation_agents.md +0 -0
  135. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-project/references/consulting_patterns.md +0 -0
  136. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-project/references/explosion_strategy.md +0 -0
  137. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-project/references/jev.coding.md +0 -0
  138. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.assistant.md +0 -0
  139. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.coding.md +0 -0
  140. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-support/SKILL.assistant.md +0 -0
  141. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-support/SKILL.coding.md +0 -0
  142. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-template/SKILL.coding.md +0 -0
  143. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-template/references/template_format.md +0 -0
  144. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-template/scripts/placeholders.py +0 -0
  145. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-todo/SKILL.coding.md +0 -0
  146. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-train/SKILL.assistant.md +0 -0
  147. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-train/SKILL.coding.md +0 -0
  148. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-train/references/config_advanced.coding.md +0 -0
  149. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-train/references/config_architectures.coding.md +0 -0
  150. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-train/references/config_training.coding.md +0 -0
  151. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-train/references/diagnostics.md +0 -0
  152. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-train/references/evaluation_guide.md +0 -0
  153. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-train/references/experiment_patterns.coding.md +0 -0
  154. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-train/references/model_selection.md +0 -0
  155. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-train/references/training_paradigms.md +0 -0
  156. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-train/references/training_troubleshooting.coding.md +0 -0
  157. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-train/references/workflow.assistant.md +0 -0
  158. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-train/references/workflow.coding.md +0 -0
  159. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ellf_skills/skills/ellf-train/scripts.coding/ellf_logger.py +0 -0
  160. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/errors.py +0 -0
  161. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/helm.py +0 -0
  162. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/interactivity.py +0 -0
  163. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/key_pair.py +0 -0
  164. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/main.py +0 -0
  165. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/mcp_proxy.py +0 -0
  166. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/pypi_auth.py +0 -0
  167. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/query.py +0 -0
  168. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/__init__.py +0 -0
  169. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/about.py +0 -0
  170. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/__init__.py +0 -0
  171. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/testing/__init__.py +0 -0
  172. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ty.py +0 -0
  173. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/ui.py +0 -0
  174. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/url.py +0 -0
  175. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/util.py +0 -0
  176. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.114_2026-08-19-08-36-57__1a4e37c1-471e-4a81-b4d5-1ffe7dec3a61 +0 -0
  177. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.114_2026-08-19-09-25-21_patch_33ff1e26-0e5e-46d8-8052-ab1d032e8b6c +0 -0
  178. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.115_2026-08-19-09-27-13_patch_4ac728c3-0342-4a36-adbc-e28d2d99b1ba +0 -0
  179. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.116_2026-08-19-09-30-47_patch_c706fef6-6813-4183-b268-12e7b00d7d0b +0 -0
  180. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.117_2026-08-19-09-39-14_patch_c6b0495f-2f88-4aa8-9ebf-0a235b4c407e +0 -0
  181. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.118_2026-08-19-09-52-00_patch_b395655a-8d78-4344-9266-6901c20f6517 +0 -0
  182. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.119_2026-08-19-10-22-38_patch_8f95c49d-aedc-41b8-816d-ccb95f048831 +0 -0
  183. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.120_2026-08-19-10-26-58_patch_7fbf35e6-cc01-4b75-8c9a-f5d054bcaf93 +0 -0
  184. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.121_2026-08-19-10-42-02_patch_31a81b02-a886-4dea-84e0-67cc6ca412d5 +0 -0
  185. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.122_2026-08-19-11-16-49_patch_1c4d7307-48d4-493e-936d-80af799d644b +0 -0
  186. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.123_2026-08-19-11-47-32_patch_d3d78d04-9989-45b1-91b1-93b571d8814a +0 -0
  187. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.124_2026-08-20-08-03-17_patch_57f4c389-2d19-41ce-aca4-13b61c62f387 +0 -0
  188. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.125_2026-08-20-08-25-05_patch_7f368148-0d1c-4525-bbdf-c6d257ad861a +0 -0
  189. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.126_2026-08-20-14-51-36_patch_a99abcc8-3371-4c63-a759-bb7ea5b32432 +0 -0
  190. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.127_2026-08-21-05-48-58_patch_34b4ccee-7596-4f57-93e9-774973cca58e +0 -0
  191. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.128_2026-08-21-10-47-20_patch_693112b9-927c-4a8f-8553-b06eef86079d +0 -0
  192. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.129_2026-08-21-11-16-54_patch_7a981666-01d9-4d1b-9ba3-2129744e3bd5 +0 -0
  193. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.130_2026-08-21-13-09-36_patch_b7ad1a76-ce70-4d70-9d1a-7c414eba5bb4 +0 -0
  194. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.131_2026-08-21-14-31-10_patch_9128ef66-193e-4caf-8710-afd86128e638 +0 -0
  195. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.132_2026-08-24-08-59-34_patch_c600fc14-86a5-460f-9c4e-f0177056f756 +0 -0
  196. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.133_2026-08-24-10-28-29_patch_b6ce3e32-9d7b-48ac-981a-270c22c180dd +0 -0
  197. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.134_2026-08-24-11-00-51_patch_a4fc0484-4a64-46a2-94f8-aa805254c7b0 +0 -0
  198. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.135_2026-08-24-12-12-41_patch_a870a56f-9a65-49eb-92da-f572b26667d8 +0 -0
  199. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.136_2026-08-24-12-42-46_patch_9b399356-6482-4291-8da7-e748a99c4b53 +0 -0
  200. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.137_2026-08-24-12-53-57_patch_f7979348-1910-40cd-a535-90299eca84ee +0 -0
  201. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.138_2026-08-24-14-36-30_patch_ed0f8750-f663-498b-85e7-0d3f2213fcfe +0 -0
  202. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.139_2026-08-25-08-37-26_patch_3ba87e19-902b-4f76-b64c-90e5c0ca1fc6 +0 -0
  203. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.140_2026-08-25-09-52-45_patch_abc830f2-df15-4385-b797-cdaf72c10752 +0 -0
  204. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.141_2026-08-25-11-37-20_patch_1d9ec01e-06f6-4c8e-b095-af17d5b62b00 +0 -0
  205. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.142_2026-08-26-07-38-49_patch_3dd23e36-e7df-494c-986f-a412861a8d40 +0 -0
  206. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.143_2026-08-26-09-32-32_patch_7b7ebd34-de27-4b73-98a7-3e1501e16cd5 +0 -0
  207. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.144_2026-08-26-10-56-43_patch_166064f2-2208-4c9b-9e25-25dc4cd32084 +0 -0
  208. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.145_2026-08-26-11-37-29_patch_b997f3ee-d7d3-4408-9f2f-c8b6d08bdb3b +0 -0
  209. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.146_2026-08-26-12-15-20_patch_afbbb893-25db-468c-81db-2663ca373068 +0 -0
  210. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.147_2026-08-26-14-10-50_patch_fd753b1f-2fa1-4ddb-a9e7-de690da85254 +0 -0
  211. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.148_2026-08-27-09-08-35_patch_23814c0b-7f77-489c-b4a8-ceadd18146e3 +0 -0
  212. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.149_2026-08-27-09-40-17_patch_8879d72e-a3d8-4abc-a16a-d9dcf75f0fa1 +0 -0
  213. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.150_2026-08-27-10-57-25_patch_afbe60ed-3e23-4d88-be3c-f800d7002a7d +0 -0
  214. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.151_2026-08-28-09-02-46_patch_1d4ca23b-aeae-4ea8-96b1-8cf57371f29d +0 -0
  215. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.152_2026-08-28-15-37-24_patch_c9d0bdc1-a7e1-432b-92b9-92dc76fe0c78 +0 -0
  216. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.153_2026-08-29-09-03-27_patch_7531573a-1b33-4092-aa9c-0e65f47b201f +0 -0
  217. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.154_2026-08-29-11-56-35_patch_919f5787-39c8-4dc1-ae6a-f27c28380f21 +0 -0
  218. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.155_2026-08-29-15-15-59_patch_822f9ed8-c366-4e5f-9791-dee8467cf3ce +0 -0
  219. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.156_2026-08-29-16-19-01_patch_3ac2bf36-20f7-4c9f-9fdb-295d4466d59e +0 -0
  220. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.157_2026-08-30-17-32-17_patch_4302354c-c9c5-4be7-acd3-542872a748d8 +0 -0
  221. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.158_2026-08-31-09-28-33_patch_3523774f-c25d-4102-8c1a-92fff046a48d +0 -0
  222. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.159_2026-08-31-10-31-01_patch_fe3e6290-2553-4154-a0a0-8b8a418280ed +0 -0
  223. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.160_2026-08-31-11-23-39_patch_e701a085-3d23-4212-b0af-73b1d419a4c1 +0 -0
  224. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.161_2026-08-31-12-41-01_patch_074d7bde-c493-44db-bc15-e81fd91e2921 +0 -0
  225. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.162_2026-08-31-13-58-06_patch_84db1d60-4280-433b-bd3a-22e5611cd315 +0 -0
  226. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.163_2026-08-31-15-25-54_patch_1931c5ba-73df-48cb-8dcb-555ace0af267 +0 -0
  227. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.163_2026-08-31-15-44-37_patch_3962e805-2a92-494a-a87b-b6e6d66c40a0 +0 -0
  228. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.165_2026-08-31-19-48-59_patch_86e5b923-2b99-4b86-b542-469b197614be +0 -0
  229. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.166_2026-09-01-07-39-57_patch_c344892f-d542-4e7b-8f27-02365a411e15 +0 -0
  230. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.167_2026-09-01-08-21-53_patch_e199d419-282a-4dbb-8756-cf98b7037e2b +0 -0
  231. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.168_2026-09-01-09-12-31_patch_235c9fe0-da15-431d-bb56-01e2b9b15f4b +0 -0
  232. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.169_2026-09-01-11-54-19_patch_98b617ab-d130-42b5-93f2-19cae56d4c4c +0 -0
  233. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.170_2026-09-02-09-27-28_patch_e448d2e6-b7ec-4235-96bf-0173b3623c87 +0 -0
  234. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.171_2026-09-02-12-52-44_patch_e6a241c2-1d62-482c-a9eb-9e3373395c50 +0 -0
  235. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.172_2026-09-04-08-47-04_patch_daae079f-c104-4fcd-bb57-7bff68e80ad9 +0 -0
  236. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.173_2026-09-04-12-34-42_patch_399c4cbd-0c28-4dfd-a4ec-e569420a36e4 +0 -0
  237. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.174_2026-09-04-13-08-48_patch_f5cfe3d5-808e-45e4-bafc-00d0554838ee +0 -0
  238. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.175_2026-09-04-17-20-46_patch_1ef542fa-5d8e-4d90-aa15-9fc4cea3dfec +0 -0
  239. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.176_2026-09-05-08-25-05_patch_ced5521f-f9da-4640-a921-95fcb5cd2e6d +0 -0
  240. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.177_2026-09-05-09-00-16_patch_803c1ad4-a9af-4953-92c5-d882dec03ea2 +0 -0
  241. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.178_2026-09-05-09-30-34_patch_012f6259-2e3f-4591-9806-1920fd06cb1f +0 -0
  242. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.179_2026-09-05-09-33-43_patch_f4bdf28c-d584-47a5-b699-8c883330162c +0 -0
  243. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.180_2026-09-05-12-02-21_patch_34a14b01-d22d-44a8-ac63-be0370a61422 +0 -0
  244. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.181_2026-09-05-12-47-46_patch_56b18867-99f6-4d5c-8215-7b9d60d34010 +0 -0
  245. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.182_2026-09-05-13-35-18_patch_61b7d4d1-73c8-4603-9b0c-593e7405587f +0 -0
  246. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.183_2026-09-06-07-27-09_patch_d76331b2-e3a3-4c0b-8412-ecd131b6ac02 +0 -0
  247. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.184_2026-09-06-10-21-47_patch_7680b7a1-49f0-4eef-b12e-4c854407448c +0 -0
  248. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.185_2026-09-06-10-30-40_patch_e56c2183-77f8-44ef-a92e-7377ea6ce8c1 +0 -0
  249. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.186_2026-09-07-10-00-51_patch_67de5683-d208-4bc0-8fb6-7677377908e7 +0 -0
  250. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.187_2026-09-07-10-18-13_patch_2086cee2-276b-48f7-80ce-6a17397b9541 +0 -0
  251. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.188_2026-09-07-12-51-28_patch_d6590822-068f-4a19-814d-34bbf204ba6e +0 -0
  252. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.189_2026-09-07-12-55-23_patch_7e0fb04b-4d40-4490-974f-c74ba2ae55a1 +0 -0
  253. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.190_2026-09-08-08-58-03_patch_15e3ac1e-4475-4272-bdd8-d00bb0db8f17 +0 -0
  254. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.191_2026-09-08-09-55-58_patch_3d350e50-ee53-4282-bc75-d2251142c46e +0 -0
  255. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.192_2026-09-08-11-12-21_patch_0733223b-1ae2-4b5b-897f-dfc57574ff83 +0 -0
  256. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.193_2026-09-08-21-48-17_patch_8d07d4e6-3555-4720-85c9-9452570fae2d +0 -0
  257. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.194_2026-09-09-07-53-43_patch_69559429-aa42-4b62-9bd7-cdfded1c00d0 +0 -0
  258. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.195_2026-09-09-09-55-40_patch_bbf67f1d-3b9a-43a2-b1bc-22df3fed8a34 +0 -0
  259. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.196_2026-09-09-09-59-47_patch_70d76812-7b3c-4192-ad49-fcaccc29b0da +0 -0
  260. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.197_2026-09-09-13-06-06_patch_d455be0b-5421-492a-b952-fab0fd8110f8 +0 -0
  261. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.198_2026-09-09-13-14-34_patch_267f54e5-311e-435e-882f-8e19191325ea +0 -0
  262. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.199_2026-09-09-22-24-18_patch_81e3e453-ca0e-42fa-9c21-8f94d43c05f2 +0 -0
  263. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.200_2026-09-10-07-19-50_patch_911714fa-1fa3-4165-bfe6-d10c650bf5bf +0 -0
  264. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.201_2026-09-10-10-14-19_patch_864015f2-b0b0-4563-a1c8-155629cb9126 +0 -0
  265. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.202_2026-09-10-11-00-05_patch_18270ecf-e770-4e69-8bcf-e5143c39929b +0 -0
  266. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.203_2026-09-10-11-10-41_patch_ff273ab1-44f3-4bc0-b184-3396e943df04 +0 -0
  267. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.204_2026-09-10-13-02-02_patch_d4ee41e2-d13c-4941-8605-3f1a42b56b22 +0 -0
  268. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.205_2026-09-10-13-57-50_patch_284df67e-5957-4b0c-bc64-5581db6ddecc +0 -0
  269. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.206_2026-09-11-10-18-50_patch_1ac7e410-0e62-4eef-bbe4-ebf93c9d0869 +0 -0
  270. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/17.0.207_2026-09-11-15-26-02_major_3f1b3ed7-eaac-41f5-b740-0af3331595d9 +0 -0
  271. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.0_2026-09-12-10-01-10_patch_8995783a-a9fa-4c4e-90b3-6386a4c481eb +0 -0
  272. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.10_2026-09-14-16-09-38_patch_9403d562-eed0-4125-a8b3-09cd92a13298 +0 -0
  273. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.11_2026-09-15-09-05-57_patch_8b22dba2-d931-4c4d-ae60-db3238d5e73d +0 -0
  274. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.12_2026-09-15-11-18-52_patch_81314afa-e70d-4ad8-b45b-3f8d62b983e7 +0 -0
  275. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.13_2026-09-16-08-00-55_patch_bfa30fc0-3281-4de6-bb56-d7290c98d1c3 +0 -0
  276. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.14_2026-09-16-14-38-26_patch_aae6e9b0-88f4-4bcf-b611-3308c7fcd6eb +0 -0
  277. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.15_2026-09-17-07-58-54_patch_43d40582-effd-4925-a8bd-e70fecf1faab +0 -0
  278. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.16_2026-09-17-08-12-37_patch_b4db2d23-88f1-45c1-82d9-78d38014fcb6 +0 -0
  279. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.17_2026-09-18-09-38-19_patch_25697fc3-e9a8-4980-962b-e6cb0a4760c5 +0 -0
  280. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.18_2026-09-18-09-54-33_patch_d37d9c71-c469-4d94-90d7-4898915ee991 +0 -0
  281. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.19_2026-09-18-10-47-33_patch_47607b3c-d1b6-4864-b9b0-00a2a8d2ac32 +0 -0
  282. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.1_2026-09-12-17-33-30_patch_f6ea2c99-a715-4c4d-876a-23ed8c62a83d +0 -0
  283. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.20_2026-09-18-11-07-21_patch_5a336f91-63a6-4877-97ed-da89395cc8f5 +0 -0
  284. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.21_2026-09-18-13-34-52_patch_c56462e1-63d9-498f-a912-c80c5f0171d1 +0 -0
  285. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.22_2026-09-20-08-10-45_patch_6afa2c20-bcef-4b7d-8685-2c9815d8683f +0 -0
  286. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.23_2026-09-20-08-38-35_patch_a7f169e5-37ab-4ec0-bf89-d14770181303 +0 -0
  287. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.24_2026-09-20-15-49-27_patch_c1222081-ff44-4f20-aea2-5840b6d76efd +0 -0
  288. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.25_2026-09-21-06-11-40_patch_6df46dd9-e7d3-4e71-bec4-e5c93b4ac863 +0 -0
  289. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.26_2026-09-21-07-54-11_patch_cc52dd36-5eba-4094-a1b0-d6f79f103441 +0 -0
  290. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.27_2026-09-21-08-36-49_patch_a25fa125-9bcd-4317-8da5-851c1c329631 +0 -0
  291. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.28_2026-09-21-09-44-01_patch_4430a721-0b3c-4f6a-b9bc-a53e667161bb +0 -0
  292. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.29_2026-09-21-10-58-07_patch_83b2b942-60a4-4bef-afd1-99690ba52b69 +0 -0
  293. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.2_2026-09-13-06-36-33_patch_176bb944-1c49-4dd3-a001-8fce908825a0 +0 -0
  294. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.30_2026-09-21-12-51-16_patch_519b9a65-d400-4234-b113-36b46e315507 +0 -0
  295. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.31_2026-09-22-06-53-35_patch_5c45a235-81b6-4d05-801a-07dc7db61400 +0 -0
  296. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.32_2026-09-22-07-42-04_patch_f12c6415-8166-4063-9e5d-26601b929d63 +0 -0
  297. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.33_2026-09-22-08-12-32_patch_cec31bb0-a6cb-43e6-8407-25aba322b54c +0 -0
  298. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.34_2026-09-23-07-09-16_patch_659fccbb-c0a0-4f6f-bc87-e6abaa8815a7 +0 -0
  299. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.35_2026-09-23-09-38-52_patch_023f904d-807a-4833-8a40-570365e8ec06 +0 -0
  300. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.36_2026-09-23-10-05-33_patch_846fb491-2b1b-47ed-ac1f-ba40e744e199 +0 -0
  301. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.37_2026-09-23-13-08-30_patch_8e4b1d24-156e-4ffe-8e4a-b8740ec18588 +0 -0
  302. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.38_2026-09-24-06-41-37_patch_67adb1d6-3f49-4357-a67f-b1d48f23a972 +0 -0
  303. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.39_2026-09-24-15-24-32_patch_e5dd375d-5643-4514-9b65-8d877c4a2bb2 +0 -0
  304. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.3_2026-09-13-12-32-46_patch_58e5ce3a-f2a7-4789-b2cd-5cc75c72b6ec +0 -0
  305. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.40_2026-09-24-19-58-14_patch_ff18824b-be51-4a3d-a621-e96279e53c3e +0 -0
  306. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.41_2026-09-26-09-24-52_patch_b9979267-30f9-440a-a4ce-c611991d4886 +0 -0
  307. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.42_2026-09-28-12-39-34_patch_dda535d9-8922-4eb9-ab51-6ecff0650c10 +0 -0
  308. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.43_2026-09-28-13-35-27_minor_aca1168a-1286-4326-9d0c-2f2587c9fe92 +0 -0
  309. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.4_2026-09-13-12-45-14_patch_b6c79d55-8f85-4f47-a304-df52b122c38c +0 -0
  310. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.5_2026-09-13-14-11-18_patch_9b111116-5e62-472a-b72c-d1bbafa22c97 +0 -0
  311. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.5_2026-09-13-17-01-11_patch_d4bf61c0-83ac-4dd3-b512-a65805d298c8 +0 -0
  312. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.6_2026-09-14-11-31-04_patch_fd2ebda6-22cb-4e7d-9452-2f6f2640e828 +0 -0
  313. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.7_2026-09-13-17-06-08_patch_428af161-0b27-43c2-8751-e5f7874df120 +0 -0
  314. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.0.9_2026-09-14-12-37-42_patch_b2ca0529-4b67-4fa4-8fdc-5f5e9f5d5166 +0 -0
  315. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.1.0_2026-09-28-14-27-54_patch_324444f7-d24e-4189-b21f-1188894a3109 +0 -0
  316. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/18.1.1_2026-09-28-21-03-07_major_e266a14a-7d96-4ece-92a3-8f34e64438a5 +0 -0
  317. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.0_2026-09-29-11-05-31_patch_77d6f9f8-ead3-4d79-a4b2-b084b2dffc98 +0 -0
  318. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.10_2026-10-02-12-56-52_patch_14e97576-73ca-44b8-82c9-7dad6f1789ab +0 -0
  319. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.11_2026-10-04-10-31-19_patch_088eb371-1799-4949-a119-286cf1cd55d1 +0 -0
  320. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.12_2026-10-06-18-00-25_patch_36554bed-49c5-41cb-9fd4-48cc6af74c09 +0 -0
  321. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.13_2026-10-07-12-24-08_patch_a540a364-3a0d-4960-b278-06ba2c7cc258 +0 -0
  322. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.14_2026-10-07-12-52-39_patch_e3a6fc5c-2ee4-414c-a2dd-4910a655a7dd +0 -0
  323. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.15_2026-10-09-04-15-56_patch_bd7a9b06-867b-4fea-9678-973a05e3022d +0 -0
  324. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.16_2026-10-09-16-11-56_patch_a1135435-7dea-4f00-8c98-203ba3974382 +0 -0
  325. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.17_2026-10-09-17-44-55_patch_faeacad8-541a-40f2-ab9c-abcd66fcd00e +0 -0
  326. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.18_2026-10-10-07-29-38_major_02601a1e-9bdb-45bf-ad67-a07b7dcd0002 +0 -0
  327. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.1_2026-09-29-11-59-38_patch_bbf4753c-d641-4c2f-ac7c-02be6bd8e7c2 +0 -0
  328. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.2_2026-09-29-12-44-07_patch_19fdaa94-60dc-464b-93b8-c17607ebc7b6 +0 -0
  329. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.3_2026-09-29-14-16-00_patch_3cb60272-95cf-4311-8897-721e1b5c2c88 +0 -0
  330. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.4_2026-09-29-16-24-53_patch_9fe8ad2b-e3ec-4558-a5fc-9c44c5c266dc +0 -0
  331. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.5_2026-09-29-17-13-16_patch_e48d2dd2-f41a-402e-a441-756b23c01dcb +0 -0
  332. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.6_2026-09-29-17-22-11_patch_3b1c79e9-9002-4e96-ba78-10668c33be6a +0 -0
  333. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.7_2026-09-30-07-50-58_patch_e8b1f046-d819-499c-9cd5-3e1a20fc9acf +0 -0
  334. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.8_2026-10-01-13-41-44_patch_7d63af18-e0af-4127-ab58-aede2407490f +0 -0
  335. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/19.0.9_2026-10-01-15-57-35_patch_143863cb-8f63-4ef7-bd78-c1114fc93a2d +0 -0
  336. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/20.0.0_2026-10-10-09-36-17_patch_d2618f39-cdc9-4d3a-ba40-1a0ad6265f3b +0 -0
  337. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/20.0.1_2026-10-11-10-24-33_patch_e29a8713-eecb-4eb1-9641-789d3cfab21a +0 -0
  338. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/20.0.2_2026-10-12-07-22-24_patch_f4053ad1-8fcd-4591-a68d-bf1e23485ba7 +0 -0
  339. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/20.0.3_2026-10-14-14-29-16_patch_070af1c4-f9d9-4f97-8112-058de90d3ea8 +0 -0
  340. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/20.0.4_2026-10-14-16-20-24_patch_c6672844-8227-4e0a-9fb5-36af7e7141dc +0 -0
  341. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/20.0.5_2026-10-15-08-53-28_patch_10154146-8afd-4632-b250-9b4b9f5bf67c +0 -0
  342. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/20.0.6_2026-10-15-14-17-40_patch_df3a5d3c-f0e0-46cb-aeaf-15b51c8a0f13 +0 -0
  343. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/20.0.7_2026-10-16-07-09-40_major_3e5dfba3-2810-47b4-85a9-938bfff72a04 +0 -0
  344. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/21.0.0_2026-10-16-10-44-29_patch_1058e453-613f-492b-a3c7-f3ca2abe8c2d +0 -0
  345. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/21.0.1_2026-10-16-16-06-10_patch_e20b4ad2-b87f-478e-b4f4-323c8bcc5ea9 +0 -0
  346. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/21.0.2_2026-10-19-13-54-31_patch_bf091df4-00bb-43c8-9117-51047944e305 +0 -0
  347. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/21.0.3_2026-10-19-14-58-29_patch_9b985381-1b1d-4531-b242-b02cea2484c5 +0 -0
  348. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/21.0.4_2026-10-20-17-08-51_patch_38d02583-cb5c-4adc-b5d7-614b483acf19 +0 -0
  349. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/21.0.5_2026-10-21-09-28-47_patch_fabd5cfe-2d04-4215-abf1-58fba226acb7 +0 -0
  350. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/21.0.6_2026-10-22-16-07-37_patch_d2bb27d7-6304-4c99-abbc-46d3dd7e363b +0 -0
  351. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/21.0.7_2026-10-27-11-41-55_patch_6b50567f-209d-42c9-a2cd-d251a2bc8fbf +0 -0
  352. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/__init__.py +0 -0
  353. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli/version/read_version.py +0 -0
  354. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli.egg-info/dependency_links.txt +0 -0
  355. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli.egg-info/entry_points.txt +0 -0
  356. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli.egg-info/not-zip-safe +0 -0
  357. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli.egg-info/requires.txt +0 -0
  358. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/ellf_cli.egg-info/top_level.txt +0 -0
  359. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/pyproject.toml +0 -0
  360. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/setup.cfg +0 -0
  361. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/setup.py +0 -0
  362. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_agents.py +0 -0
  363. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_agents_info_stats.py +0 -0
  364. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_appdirs.py +0 -0
  365. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_auth.py +0 -0
  366. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_clusters_info_stats.py +0 -0
  367. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_config.py +0 -0
  368. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_datasets_export.py +0 -0
  369. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_errors.py +0 -0
  370. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_files_cp.py +0 -0
  371. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_files_cp_helpers.py +0 -0
  372. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_helm.py +0 -0
  373. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_import_export.py +0 -0
  374. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_info.py +0 -0
  375. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_infra_config_io.py +0 -0
  376. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_infra_configure.py +0 -0
  377. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_infra_deploy_node_labels.py +0 -0
  378. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_infra_deploy_preflight.py +0 -0
  379. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_infra_destroy.py +0 -0
  380. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_infra_get_terraform.py +0 -0
  381. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_infra_hibernate.py +0 -0
  382. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_infra_init.py +0 -0
  383. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_infra_pause.py +0 -0
  384. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_infra_provision.py +0 -0
  385. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_infra_start_fixes.py +0 -0
  386. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_infra_start_validation.py +0 -0
  387. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_infra_state_bucket.py +0 -0
  388. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_infra_terraform_init.py +0 -0
  389. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_invalid_secrets.py +0 -0
  390. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_job_list_project_filter.py +0 -0
  391. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_jobs_info_hides_creator.py +0 -0
  392. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_jobs_list_unmatched.py +0 -0
  393. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_key_pair.py +0 -0
  394. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_login.py +0 -0
  395. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_logout.py +0 -0
  396. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_main.py +0 -0
  397. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_mcp_proxy.py +0 -0
  398. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_org_select.py +0 -0
  399. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_plans.py +0 -0
  400. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_projects.py +0 -0
  401. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_projects_delete_confirm.py +0 -0
  402. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_publish_build_poll.py +0 -0
  403. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_publish_data.py +0 -0
  404. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_publish_import_root.py +0 -0
  405. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_publish_requirements.py +0 -0
  406. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_publish_versions.py +0 -0
  407. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_pypi_auth.py +0 -0
  408. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_query.py +0 -0
  409. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_recipe_file.py +0 -0
  410. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_recipe_required_args.py +0 -0
  411. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_recipes.py +0 -0
  412. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_sessions.py +0 -0
  413. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_state.py +0 -0
  414. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_support.py +0 -0
  415. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_todos.py +0 -0
  416. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_ty.py +0 -0
  417. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_ui.py +0 -0
  418. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_ui_extras.py +0 -0
  419. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_usage_counts.py +0 -0
  420. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_users_assign.py +0 -0
  421. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_users_info_stats.py +0 -0
  422. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_users_list.py +0 -0
  423. {ellf_cli-21.0.8 → ellf_cli-21.0.9}/tests/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 21.0.8
3
+ Version: 21.0.9
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
@@ -19,7 +19,7 @@ Create a new action. The available action recipes are fetched from your cluster
19
19
  | Argument | Type | Description | Default |
20
20
  | --- | --- | --- | --- |
21
21
  | `--exists-ok` | `bool` | Don't raise an error if it already exists | `False` |
22
- | `--no-start` | `bool` | Don't start {noun} after creation | `False` |
22
+ | `--no-start` | `bool` | Don't start action after creation | `False` |
23
23
  | `--no-wait` | `bool` | Don't wait for the action to be ready after starting | `False` |
24
24
  | `--json` | `bool` | Output the result as JSON | `False` |
25
25
  | `--help`, `-h` | `bool` | Show help message | `False` |
@@ -178,7 +178,7 @@ Create a new agent. The available agent recipes are fetched from your cluster an
178
178
  | Argument | Type | Description | Default |
179
179
  | --- | --- | --- | --- |
180
180
  | `--exists-ok` | `bool` | Don't raise an error if it already exists | `False` |
181
- | `--no-start` | `bool` | Don't start {noun} after creation | `False` |
181
+ | `--no-start` | `bool` | Don't start agent after creation | `False` |
182
182
  | `--no-wait` | `bool` | Don't wait for the agent to be ready after starting | `False` |
183
183
  | `--json` | `bool` | Output the result as JSON | `False` |
184
184
  | `--help`, `-h` | `bool` | Show help message | `False` |
@@ -1262,7 +1262,7 @@ Create a new service. The available service recipes are fetched from your cluste
1262
1262
  | Argument | Type | Description | Default |
1263
1263
  | --- | --- | --- | --- |
1264
1264
  | `--exists-ok` | `bool` | Don't raise an error if it already exists | `False` |
1265
- | `--no-start` | `bool` | Don't start {noun} after creation | `False` |
1265
+ | `--no-start` | `bool` | Don't start service after creation | `False` |
1266
1266
  | `--no-wait` | `bool` | Don't wait for the service to be ready after starting | `False` |
1267
1267
  | `--json` | `bool` | Output the result as JSON | `False` |
1268
1268
  | `--help`, `-h` | `bool` | Show help message | `False` |
@@ -1425,7 +1425,7 @@ Create a new task. The available task recipes are fetched from your cluster and
1425
1425
  | Argument | Type | Description | Default |
1426
1426
  | --- | --- | --- | --- |
1427
1427
  | `--exists-ok` | `bool` | Don't raise an error if it already exists | `False` |
1428
- | `--no-start` | `bool` | Don't start {noun} after creation | `False` |
1428
+ | `--no-start` | `bool` | Don't start task after creation | `False` |
1429
1429
  | `--no-wait` | `bool` | Don't wait for the task to be ready after starting | `False` |
1430
1430
  | `--json` | `bool` | Output the result as JSON | `False` |
1431
1431
  | `--help`, `-h` | `bool` | Show help message | `False` |
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from argparse import SUPPRESS
3
4
  from collections.abc import Callable
4
5
  from typing import cast
5
6
  from uuid import UUID
@@ -52,6 +53,19 @@ def get_converter(arg_type: type) -> ConverterType | None:
52
53
  return CONVERTERS.get(arg_type, None)
53
54
 
54
55
 
56
+ def create_options(noun: str) -> dict[str, Arg]:
57
+ """Flags of the `<jobs> create` commands themselves. Radicli parses these
58
+ before the recipe arguments, so they're also passed to the recipe's
59
+ parser to show up in `<jobs> create <recipe> --help`.
60
+ """
61
+ return {
62
+ "exists_ok": Arg("--exists-ok", help=Messages.exists_ok),
63
+ "no_start": Arg("--no-start", help=Messages.no_start.format(noun=noun)),
64
+ "no_wait": Arg("--no-wait", help=Messages.no_wait.format(noun=noun)),
65
+ "as_json": Arg("--json", help=Messages.as_json),
66
+ }
67
+
68
+
55
69
  def _get_noun(recipe: RecipeDetail | RecipeSummary) -> str:
56
70
  """A recipe's job type: one of task, action, agent, service. Prefer job_type
57
71
  and fall back to is_action only when it is absent.
@@ -111,6 +125,7 @@ def create_from_recipe(
111
125
  command: str,
112
126
  show_help: bool,
113
127
  exists_ok: bool = False,
128
+ options: dict[str, Arg] | None = None,
114
129
  ) -> tuple[UUID, RecipePlanCreating]:
115
130
  # There's a few steps here:
116
131
  # 1. Parse the CLI string into arguments
@@ -124,6 +139,7 @@ def create_from_recipe(
124
139
  parser_prog=f"{cli.prog} {command} create {recipe.name.lower()}",
125
140
  show_help=show_help,
126
141
  get_project_id=_get_default_project_id,
142
+ options=options,
127
143
  )
128
144
  except ShowHelp as e:
129
145
  print(e.help_text)
@@ -163,17 +179,18 @@ def _parse_plan(
163
179
  parser_prog: str,
164
180
  show_help: bool,
165
181
  get_project_id: Callable[[], UUID | None],
182
+ options: dict[str, Arg] | None = None,
166
183
  ) -> tuple[str | None, UUID, RecipePlanCreating]:
167
184
  # This function works hard to be pure and not rely on
168
185
  # external state. This way we'll be able to work with it in
169
186
  # the compatibility tests more easily.
170
187
  noun = _get_noun(recipe)
171
188
  ap_args = _get_argparse_args(recipe)
172
- parser = _get_argparse_parser(parser_prog, recipe, ap_args)
189
+ parser = _get_argparse_parser(parser_prog, recipe, ap_args, options=options)
173
190
  if not args or show_help:
174
191
  raise ShowHelp(parser.format_help())
175
192
  task_or_action_name, project_id, worker_class, plan_args = _parse_cli_args(
176
- parser, args
193
+ parser, args, options=options
177
194
  )
178
195
  missing = _check_missing(recipe, ap_args, plan_args)
179
196
  if missing:
@@ -204,8 +221,11 @@ def _get_default_project_id() -> UUID | None:
204
221
  def _parse_cli_args(
205
222
  parser: ArgumentParser,
206
223
  args: list[str],
224
+ *,
225
+ options: dict[str, Arg] | None = None,
207
226
  ) -> tuple[str | None, UUID | None, str | None, dict[str, Arg]]:
208
227
  parsed = vars(parser.parse_args(args))
228
+ _pop_non_recipe_args(parsed, options)
209
229
  task_or_action_name = parsed.pop("name", None)
210
230
  assert isinstance(task_or_action_name, (str, type(None)))
211
231
  project_ref = parsed.pop("project_id")
@@ -216,10 +236,19 @@ def _parse_cli_args(
216
236
  # project reference, so it stays consistent.
217
237
  project_id = resolve_project_id(project_ref)
218
238
  worker_class = parsed.pop("worker_class", None)
219
- parsed.pop("runtime", None) # legacy field, ignored
220
239
  return (task_or_action_name, project_id, worker_class, parsed)
221
240
 
222
241
 
242
+ def _pop_non_recipe_args(
243
+ parsed: dict[str, object], options: dict[str, Arg] | None
244
+ ) -> None:
245
+ # The create options are consumed by radicli before the recipe parser
246
+ # runs, and --runtime is a legacy flag that's accepted but ignored
247
+ parsed.pop("runtime", None)
248
+ for key in options or {}:
249
+ parsed.pop(key, None)
250
+
251
+
223
252
  def _check_missing(recipe: RecipeDetail, ap_args, parsed) -> list[str]:
224
253
  optional = get_field_optional(recipe.form_schema) # type: ignore[arg-type]
225
254
  # Arg ids are CLI names, which can rename a union variant to its union's
@@ -256,7 +285,11 @@ def _get_argparse_args(recipe: RecipeDetail) -> list[ArgparseArg]:
256
285
 
257
286
 
258
287
  def _get_argparse_parser(
259
- prog: str, recipe: RecipeDetail, ap_args: list[ArgparseArg]
288
+ prog: str,
289
+ recipe: RecipeDetail,
290
+ ap_args: list[ArgparseArg],
291
+ *,
292
+ options: dict[str, Arg] | None = None,
260
293
  ) -> ArgumentParser:
261
294
  noun = _get_noun(recipe)
262
295
  # To get argument parsing and consistent help docs out-of-the-box we create
@@ -285,13 +318,12 @@ def _get_argparse_parser(
285
318
  worker_class = get_arg("worker_class", worker_class_arg, str, default=None)
286
319
  worker_class_args, worker_class_kwargs = worker_class.to_argparse()
287
320
  p.add_argument(*worker_class_args, **worker_class_kwargs)
288
- runtime_arg = Arg(
289
- "--runtime",
290
- help=Messages.recipe_runtime.format(noun=noun),
291
- )
292
- runtime = get_arg("runtime", runtime_arg, str, default=None)
293
- runtime_args, runtime_kwargs = runtime.to_argparse()
294
- p.add_argument(*runtime_args, **runtime_kwargs)
321
+ p.add_argument("--runtime", dest="runtime", default=None, help=SUPPRESS)
322
+ if options:
323
+ group = p.add_argument_group("create options")
324
+ for key, arg in options.items():
325
+ assert arg.option is not None
326
+ group.add_argument(arg.option, dest=key, action="store_true", help=arg.help)
295
327
  return p
296
328
 
297
329
 
@@ -433,6 +465,7 @@ def create_from_recipe_file(
433
465
  command: str,
434
466
  show_help: bool,
435
467
  job_type: str,
468
+ options: dict[str, Arg] | None = None,
436
469
  ) -> broker_models.JobSpec:
437
470
  """Parse CLI args and build a JobSpec directly, bypassing PAM.
438
471
 
@@ -440,12 +473,16 @@ def create_from_recipe_file(
440
473
  """
441
474
  ap_args = _get_argparse_args(recipe)
442
475
  parser = _get_argparse_parser(
443
- f"{cli.prog} {command} create {recipe.name.lower()}", recipe, ap_args
476
+ f"{cli.prog} {command} create {recipe.name.lower()}",
477
+ recipe,
478
+ ap_args,
479
+ options=options,
444
480
  )
445
481
  if not args or show_help:
446
482
  print(parser.format_help())
447
483
  raise SystemExit(0)
448
484
  parsed = vars(parser.parse_args(args))
485
+ _pop_non_recipe_args(parsed, options)
449
486
  job_name = parsed.pop("name", None)
450
487
  parsed.pop("project_id", None)
451
488
  parsed.pop("worker_class", None)
@@ -36,18 +36,18 @@ from ._project_scope import resolve_list_project_id
36
36
  from ._recipe_subcommand import (
37
37
  create_from_recipe,
38
38
  create_from_recipe_file,
39
+ create_options,
39
40
  request_recipes,
40
41
  )
41
42
  from ._state import get_auth_state, get_saved_settings
42
43
 
44
+ CREATE_OPTIONS = create_options("action")
45
+
43
46
 
44
47
  @cli.subcommand_with_extra(
45
48
  "actions",
46
49
  "create",
47
- exists_ok=Arg("--exists-ok", help=Messages.exists_ok),
48
- no_start=Arg("--no-start", help=Messages.no_start),
49
- no_wait=Arg("--no-wait", help=Messages.no_wait.format(noun="action")),
50
- as_json=Arg("--json", help=Messages.as_json),
50
+ **CREATE_OPTIONS,
51
51
  _show_help=Arg("--help", "-h", help=Messages.help),
52
52
  )
53
53
  def create(
@@ -84,7 +84,12 @@ def create(
84
84
  if is_file_mode:
85
85
  schema = action_schemas[name]
86
86
  job_spec = create_from_recipe_file(
87
- schema, args, command="actions", show_help=_show_help, job_type="action"
87
+ schema,
88
+ args,
89
+ command="actions",
90
+ show_help=_show_help,
91
+ job_type="action",
92
+ options=CREATE_OPTIONS,
88
93
  )
89
94
  print_mutation_result(
90
95
  {"id": str(job_spec.job_id), "name": job_spec.name},
@@ -109,7 +114,12 @@ def create(
109
114
  return job_spec.job_id
110
115
  schema = resolve_recipe(name, cluster_id=auth.cluster_id)
111
116
  action_id, plan = create_from_recipe(
112
- schema, args, command="actions", show_help=_show_help, exists_ok=exists_ok
117
+ schema,
118
+ args,
119
+ command="actions",
120
+ show_help=_show_help,
121
+ exists_ok=exists_ok,
122
+ options=CREATE_OPTIONS,
113
123
  )
114
124
  print_mutation_result(
115
125
  {"id": str(action_id)},
@@ -39,18 +39,18 @@ from ._project_scope import resolve_list_project_id
39
39
  from ._recipe_subcommand import (
40
40
  create_from_recipe,
41
41
  create_from_recipe_file,
42
+ create_options,
42
43
  request_recipes,
43
44
  )
44
45
  from ._state import get_auth_state, get_saved_settings
45
46
 
47
+ CREATE_OPTIONS = create_options("agent")
48
+
46
49
 
47
50
  @cli.subcommand_with_extra(
48
51
  "agents",
49
52
  "create",
50
- exists_ok=Arg("--exists-ok", help=Messages.exists_ok),
51
- no_start=Arg("--no-start", help=Messages.no_start),
52
- no_wait=Arg("--no-wait", help=Messages.no_wait.format(noun="agent")),
53
- as_json=Arg("--json", help=Messages.as_json),
53
+ **CREATE_OPTIONS,
54
54
  _show_help=Arg("--help", "-h", help=Messages.help),
55
55
  )
56
56
  def create(
@@ -87,7 +87,12 @@ def create(
87
87
  if is_file_mode:
88
88
  schema = schemas[name]
89
89
  job_spec = create_from_recipe_file(
90
- schema, args, command="agents", show_help=_show_help, job_type="agent"
90
+ schema,
91
+ args,
92
+ command="agents",
93
+ show_help=_show_help,
94
+ job_type="agent",
95
+ options=CREATE_OPTIONS,
91
96
  )
92
97
  print_mutation_result(
93
98
  {"id": str(job_spec.job_id), "name": job_spec.name},
@@ -112,7 +117,12 @@ def create(
112
117
  return job_spec.job_id
113
118
  schema = resolve_recipe(name, cluster_id=auth.cluster_id)
114
119
  agent_id, plan = create_from_recipe(
115
- schema, args, command="agents", show_help=_show_help, exists_ok=exists_ok
120
+ schema,
121
+ args,
122
+ command="agents",
123
+ show_help=_show_help,
124
+ exists_ok=exists_ok,
125
+ options=CREATE_OPTIONS,
116
126
  )
117
127
  print_mutation_result(
118
128
  {"id": str(agent_id)},
@@ -36,18 +36,18 @@ from ._project_scope import resolve_list_project_id
36
36
  from ._recipe_subcommand import (
37
37
  create_from_recipe,
38
38
  create_from_recipe_file,
39
+ create_options,
39
40
  request_recipes,
40
41
  )
41
42
  from ._state import get_auth_state, get_saved_settings
42
43
 
44
+ CREATE_OPTIONS = create_options("service")
45
+
43
46
 
44
47
  @cli.subcommand_with_extra(
45
48
  "services",
46
49
  "create",
47
- exists_ok=Arg("--exists-ok", help=Messages.exists_ok),
48
- no_start=Arg("--no-start", help=Messages.no_start),
49
- no_wait=Arg("--no-wait", help=Messages.no_wait.format(noun="service")),
50
- as_json=Arg("--json", help=Messages.as_json),
50
+ **CREATE_OPTIONS,
51
51
  _show_help=Arg("--help", "-h", help=Messages.help),
52
52
  )
53
53
  def create(
@@ -84,7 +84,12 @@ def create(
84
84
  if is_file_mode:
85
85
  schema = schemas[name]
86
86
  job_spec = create_from_recipe_file(
87
- schema, args, command="services", show_help=_show_help, job_type="service"
87
+ schema,
88
+ args,
89
+ command="services",
90
+ show_help=_show_help,
91
+ job_type="service",
92
+ options=CREATE_OPTIONS,
88
93
  )
89
94
  print_mutation_result(
90
95
  {"id": str(job_spec.job_id), "name": job_spec.name},
@@ -109,7 +114,12 @@ def create(
109
114
  return job_spec.job_id
110
115
  schema = resolve_recipe(name, cluster_id=auth.cluster_id)
111
116
  service_id, plan = create_from_recipe(
112
- schema, args, command="services", show_help=_show_help, exists_ok=exists_ok
117
+ schema,
118
+ args,
119
+ command="services",
120
+ show_help=_show_help,
121
+ exists_ok=exists_ok,
122
+ options=CREATE_OPTIONS,
113
123
  )
114
124
  print_mutation_result(
115
125
  {"id": str(service_id)},
@@ -40,18 +40,18 @@ from ._project_scope import resolve_list_project_id
40
40
  from ._recipe_subcommand import (
41
41
  create_from_recipe,
42
42
  create_from_recipe_file,
43
+ create_options,
43
44
  request_recipes,
44
45
  )
45
46
  from ._state import get_auth_state, get_saved_settings
46
47
 
48
+ CREATE_OPTIONS = create_options("task")
49
+
47
50
 
48
51
  @cli.subcommand_with_extra(
49
52
  "tasks",
50
53
  "create",
51
- exists_ok=Arg("--exists-ok", help=Messages.exists_ok),
52
- no_start=Arg("--no-start", help=Messages.no_start),
53
- no_wait=Arg("--no-wait", help=Messages.no_wait.format(noun="task")),
54
- as_json=Arg("--json", help=Messages.as_json),
54
+ **CREATE_OPTIONS,
55
55
  _show_help=Arg("--help", "-h", help=Messages.help),
56
56
  )
57
57
  def create(
@@ -94,7 +94,12 @@ def create(
94
94
  if is_file_mode:
95
95
  schema = schemas[name]
96
96
  job_spec = create_from_recipe_file(
97
- schema, args, command="tasks", show_help=_show_help, job_type="task"
97
+ schema,
98
+ args,
99
+ command="tasks",
100
+ show_help=_show_help,
101
+ job_type="task",
102
+ options=CREATE_OPTIONS,
98
103
  )
99
104
  print_mutation_result(
100
105
  {"id": str(job_spec.job_id), "name": job_spec.name},
@@ -119,7 +124,12 @@ def create(
119
124
  return job_spec.job_id
120
125
  schema = resolve_recipe(name, cluster_id=auth.cluster_id)
121
126
  task_id, plan = create_from_recipe(
122
- schema, args, command="tasks", show_help=_show_help, exists_ok=exists_ok
127
+ schema,
128
+ args,
129
+ command="tasks",
130
+ show_help=_show_help,
131
+ exists_ok=exists_ok,
132
+ options=CREATE_OPTIONS,
123
133
  )
124
134
  print_mutation_result(
125
135
  {"id": str(task_id)},
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "prog": "ellf",
3
3
  "help": "Ellf Command Line Interface.",
4
- "version": "21.0.8",
4
+ "version": "21.0.9",
5
5
  "extra_key": "_extra",
6
6
  "commands": {
7
7
  "actions": {
@@ -542,9 +542,9 @@
542
542
  "id": "no_start",
543
543
  "option": "--no-start",
544
544
  "short": null,
545
- "orig_help": "Don't start {noun} after creation",
545
+ "orig_help": "Don't start action after creation",
546
546
  "default": false,
547
- "help": "Don't start {noun} after creation (bool)",
547
+ "help": "Don't start action after creation (bool)",
548
548
  "action": "store_true",
549
549
  "choices": null,
550
550
  "has_converter": false,
@@ -1049,9 +1049,9 @@
1049
1049
  "id": "no_start",
1050
1050
  "option": "--no-start",
1051
1051
  "short": null,
1052
- "orig_help": "Don't start {noun} after creation",
1052
+ "orig_help": "Don't start agent after creation",
1053
1053
  "default": false,
1054
- "help": "Don't start {noun} after creation (bool)",
1054
+ "help": "Don't start agent after creation (bool)",
1055
1055
  "action": "store_true",
1056
1056
  "choices": null,
1057
1057
  "has_converter": false,
@@ -7118,9 +7118,9 @@
7118
7118
  "id": "no_start",
7119
7119
  "option": "--no-start",
7120
7120
  "short": null,
7121
- "orig_help": "Don't start {noun} after creation",
7121
+ "orig_help": "Don't start service after creation",
7122
7122
  "default": false,
7123
- "help": "Don't start {noun} after creation (bool)",
7123
+ "help": "Don't start service after creation (bool)",
7124
7124
  "action": "store_true",
7125
7125
  "choices": null,
7126
7126
  "has_converter": false,
@@ -8024,9 +8024,9 @@
8024
8024
  "id": "no_start",
8025
8025
  "option": "--no-start",
8026
8026
  "short": null,
8027
- "orig_help": "Don't start {noun} after creation",
8027
+ "orig_help": "Don't start task after creation",
8028
8028
  "default": false,
8029
- "help": "Don't start {noun} after creation (bool)",
8029
+ "help": "Don't start task after creation (bool)",
8030
8030
  "action": "store_true",
8031
8031
  "choices": null,
8032
8032
  "has_converter": false,
@@ -233,7 +233,6 @@ ellf secret create my-credentials OPENAI_API_KEY="sk-..." CUSTOM_SECRET=-
233
233
  remote_path = "Remote location path"
234
234
  recipe_project_id = "Project ID to add {noun} to"
235
235
  recipe_worker_class = "Worker class to launch the {noun} on, as configured on your cluster. Omit to use the cluster default; passing an unknown name returns the list of available ones."
236
- recipe_runtime = "Runtime to launch the {noun} on"
237
236
  check_s3_bucket = "Run checks involving the S3 storage"
238
237
  check_nfs_path = "Run checks involving the NFS storage"
239
238
  check_recipe = "Run checks that need to operate over a recipe. This argument only makes sense when used with --recipe-args"
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "Custom Recipes",
3
+ "version": "0.1.0",
4
+ "short_description": "Custom Recipes Package for Ellf",
5
+ "author": "",
6
+ "email": "",
7
+ "url": "",
8
+ "license": "",
9
+ "package_dir": "",
10
+ "package_name": "{{ cookiecutter.name|lower|replace(' ', '_') }}"
11
+ }
@@ -10,4 +10,3 @@ dist
10
10
  .pytest_cache
11
11
 
12
12
  .coverage
13
- {{cookiecutter.package_name}}/meta.json
@@ -0,0 +1,78 @@
1
+ # Ellf Recipes - {{cookiecutter.name}}
2
+
3
+ This project contains a Python package with custom Ellf recipes.
4
+
5
+ {{cookiecutter.short_description}}
6
+
7
+ ## Python environment
8
+
9
+ Create and activate a virtual environment with Python 3.10 or above. Your
10
+ cluster runs recipes on Python 3.13, so using the same version locally avoids
11
+ surprises.
12
+
13
+ ```console
14
+ $ python3 -m venv .venv
15
+ $ source .venv/bin/activate
16
+ $ python -m pip install --upgrade pip
17
+ $ python -m pip install -r requirements.in
18
+ ```
19
+
20
+ Then run `ellf login` with the environment active. Besides signing you in, this
21
+ points the environment's `pip` at the private index that hosts Prodigy, so you
22
+ can install it later. If you use `uv` instead of `pip`, `ellf login` prints the
23
+ `UV_EXTRA_INDEX_URL` and `UV_KEYRING_PROVIDER` variables to set.
24
+
25
+ ## Edit
26
+
27
+ The recipes live in `{{cookiecutter.package_name}}/recipes/`. `example_task.py`
28
+ shows a minimal annotation task. Each recipe is a function decorated with one of
29
+ `task_recipe`, `action_recipe`, `agent_recipe` or `service_recipe` from
30
+ `ellf_recipes_sdk`.
31
+
32
+ To add a recipe, create a new module in `{{cookiecutter.package_name}}/recipes/`
33
+ and import it from `{{cookiecutter.package_name}}/recipes/__init__.py`. Only
34
+ imported modules are published, and the import order sets the order recipes
35
+ are shown in the app.
36
+
37
+ Import types such as `RecipeSettingsType` from `ellf_recipes_sdk`, not from
38
+ `prodigy`. Publishing imports your package locally to read the recipe
39
+ definitions, and it doesn't need Prodigy installed unless your modules import
40
+ it at the top level. Put any other `prodigy` imports inside the recipe
41
+ functions.
42
+
43
+ ## Test locally (optional)
44
+
45
+ To run or test recipes on your machine you need Prodigy. After `ellf login`
46
+ has configured the environment, install it with the development requirements:
47
+
48
+ ```console
49
+ $ python -m pip install -r requirements-dev.in
50
+ $ python -m pytest tests
51
+ ```
52
+
53
+ ## Publish
54
+
55
+ Publish the package to your cluster from the package directory:
56
+
57
+ ```console
58
+ $ ellf publish code .
59
+ ```
60
+
61
+ This builds the package, reads the recipe definitions from it and builds a
62
+ container image on your cluster. Dependencies listed in `requirements.in` are
63
+ installed into the image. You can't publish the same version twice, so
64
+ increase `__version__` in `{{cookiecutter.package_name}}/about.py` before
65
+ publishing changes.
66
+
67
+ ## Run
68
+
69
+ Once published, the recipes appear in the app and in the CLI:
70
+
71
+ ```console
72
+ $ ellf tasks create example_task --help
73
+ $ ellf tasks create example_task --name "My first task" --dataset my_dataset --no-start
74
+ $ ellf tasks start "My first task"
75
+ ```
76
+
77
+ `--no-start` creates the task without starting it, so you can review its
78
+ settings first.
@@ -19,10 +19,11 @@ def setup():
19
19
  about = {}
20
20
  exec(f.read(), about)
21
21
 
22
- # Read in requirements and split into packages and URLs
22
+ # Read in requirements, skipping blank lines and comments
23
23
  requirements_path = root / "requirements.in"
24
24
  with requirements_path.open("r", encoding="utf8") as f:
25
- requirements = [line.strip() for line in f]
25
+ lines = [line.strip() for line in f]
26
+ requirements = [line for line in lines if line and not line.startswith("#")]
26
27
 
27
28
  setuptools.setup(
28
29
  name=package_name,
@@ -1,8 +1,12 @@
1
1
  from typing import Literal
2
2
 
3
- from prodigy.types import RecipeSettingsType
4
-
5
- from ellf_recipes_sdk import Dataset, IntProps, props, task_recipe
3
+ from ellf_recipes_sdk import (
4
+ Dataset,
5
+ IntProps,
6
+ RecipeSettingsType,
7
+ props,
8
+ task_recipe,
9
+ )
6
10
 
7
11
 
8
12
  @task_recipe(
@@ -0,0 +1,3 @@
1
+ 21.0.8
2
+ patch
3
+ bdab3ee6-fba8-4625-9243-c4cbe839ba32
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 21.0.8
3
+ Version: 21.0.9
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
@@ -349,6 +349,7 @@ ellf_cli/version/21.0.4_2026-10-20-17-08-51_patch_38d02583-cb5c-4adc-b5d7-614b48
349
349
  ellf_cli/version/21.0.5_2026-10-21-09-28-47_patch_fabd5cfe-2d04-4215-abf1-58fba226acb7
350
350
  ellf_cli/version/21.0.6_2026-10-22-16-07-37_patch_d2bb27d7-6304-4c99-abbc-46d3dd7e363b
351
351
  ellf_cli/version/21.0.7_2026-10-27-11-41-55_patch_6b50567f-209d-42c9-a2cd-d251a2bc8fbf
352
+ ellf_cli/version/21.0.8_2026-10-29-13-48-18_patch_bdab3ee6-fba8-4625-9243-c4cbe839ba32
352
353
  ellf_cli/version/__init__.py
353
354
  ellf_cli/version/read_version.py
354
355
  tests/test_agents.py
@@ -399,8 +400,10 @@ tests/test_publish_versions.py
399
400
  tests/test_pypi_auth.py
400
401
  tests/test_query.py
401
402
  tests/test_recipe_file.py
403
+ tests/test_recipe_help.py
402
404
  tests/test_recipe_required_args.py
403
405
  tests/test_recipes.py
406
+ tests/test_recipes_init.py
404
407
  tests/test_sessions.py
405
408
  tests/test_state.py
406
409
  tests/test_support.py