ellf-cli 20.0.7__tar.gz → 21.0.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 (405) hide show
  1. {ellf_cli-20.0.7/ellf_cli.egg-info → ellf_cli-21.0.1}/PKG-INFO +1 -1
  2. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/README.md +1 -1
  3. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/agents.py +19 -5
  4. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/infra/_helpers.py +36 -14
  5. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/infra/deploy.py +70 -3
  6. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf.json +3 -3
  7. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/messages.py +2 -2
  8. ellf_cli-21.0.1/ellf_cli/version/20.0.7_2026-10-16-07-09-40_major_3e5dfba3-2810-47b4-85a9-938bfff72a04 +3 -0
  9. ellf_cli-21.0.1/ellf_cli/version/21.0.0_2026-10-16-10-44-29_patch_1058e453-613f-492b-a3c7-f3ca2abe8c2d +3 -0
  10. {ellf_cli-20.0.7 → ellf_cli-21.0.1/ellf_cli.egg-info}/PKG-INFO +1 -1
  11. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli.egg-info/SOURCES.txt +3 -0
  12. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_agents.py +26 -2
  13. ellf_cli-21.0.1/tests/test_infra_deploy_preflight.py +75 -0
  14. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/LICENSE +0 -0
  15. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/MANIFEST.in +0 -0
  16. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/__init__.py +0 -0
  17. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/__main__.py +0 -0
  18. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/about.json +0 -0
  19. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/about.py +0 -0
  20. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/appdirs.py +0 -0
  21. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/auth.py +0 -0
  22. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/cli.py +0 -0
  23. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/cloud/__init__.py +0 -0
  24. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/cloud/gcp.py +0 -0
  25. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/cluster_config.py +0 -0
  26. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/__init__.py +0 -0
  27. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/_cluster_select.py +0 -0
  28. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/_org_select.py +0 -0
  29. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/_project_scope.py +0 -0
  30. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/_recipe_file.py +0 -0
  31. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/_recipe_subcommand.py +0 -0
  32. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/_state.py +0 -0
  33. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/_usage.py +0 -0
  34. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/actions.py +0 -0
  35. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/agents.py +0 -0
  36. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/assets.py +0 -0
  37. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/auth.py +0 -0
  38. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/clusters.py +0 -0
  39. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/config.py +0 -0
  40. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/datasets.py +0 -0
  41. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/files/__init__.py +0 -0
  42. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/files/cp.py +0 -0
  43. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/files/ls.py +0 -0
  44. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/files/rm.py +0 -0
  45. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/files/rsync.py +0 -0
  46. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/files/stats.py +0 -0
  47. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/general.py +0 -0
  48. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/import_export.py +0 -0
  49. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/infra/__init__.py +0 -0
  50. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/infra/_config_io.py +0 -0
  51. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/infra/configure.py +0 -0
  52. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/infra/hibernate.py +0 -0
  53. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/infra/init.py +0 -0
  54. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/infra/init_values.py +0 -0
  55. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/infra/pause.py +0 -0
  56. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/infra/provision.py +0 -0
  57. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/infra/register.py +0 -0
  58. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/infra/setup.py +0 -0
  59. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/infra/start.py +0 -0
  60. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/infra/terraform.py +0 -0
  61. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/infra/tls.py +0 -0
  62. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/jobs.py +0 -0
  63. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/mcp.py +0 -0
  64. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/packages.py +0 -0
  65. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/paths.py +0 -0
  66. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/plans.py +0 -0
  67. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/projects.py +0 -0
  68. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/publish_code.py +0 -0
  69. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/publish_data.py +0 -0
  70. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/recipes.py +0 -0
  71. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/secrets.py +0 -0
  72. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/services.py +0 -0
  73. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/sessions.py +0 -0
  74. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/support.py +0 -0
  75. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/tasks.py +0 -0
  76. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/todos.py +0 -0
  77. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/commands/users.py +0 -0
  78. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/config.py +0 -0
  79. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/.gitignore +0 -0
  80. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/render.py +0 -0
  81. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.assistant.md +0 -0
  82. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.coding.md +0 -0
  83. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate/references/annotation_audit.assistant.md +0 -0
  84. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate/references/annotation_audit.coding.md +0 -0
  85. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_ellf_annotation_recipes.assistant.md +0 -0
  86. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_ellf_annotation_recipes.coding.md +0 -0
  87. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_prodigy_recipes.coding.md +0 -0
  88. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate/references/label_schemes.assistant.md +0 -0
  89. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate/references/label_schemes.coding.md +0 -0
  90. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-ask/SKILL.md +0 -0
  91. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-handoff/SKILL.assistant.md +0 -0
  92. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.assistant.md +0 -0
  93. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.coding.md +0 -0
  94. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-monitor/references/annotation_metrics.assistant.md +0 -0
  95. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-monitor/references/annotation_metrics.coding.md +0 -0
  96. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-monitor/references/training_monitoring.assistant.md +0 -0
  97. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-monitor/references/training_monitoring.coding.md +0 -0
  98. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-monitor/scripts.coding/check_training.py +0 -0
  99. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-ops/SKILL.assistant.md +0 -0
  100. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-ops/SKILL.coding.md +0 -0
  101. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-ops/references.coding/data_infra_cli.md +0 -0
  102. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-ops/scripts.coding/run_job.py +0 -0
  103. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-patterns/SKILL.coding.md +0 -0
  104. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-patterns/references/pattern_strategies.md +0 -0
  105. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/SKILL.coding.md +0 -0
  106. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_action_recipe.py +0 -0
  107. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_agent_recipe.py +0 -0
  108. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_blocks_ui.py +0 -0
  109. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_correct.py +0 -0
  110. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_custom_ui.py +0 -0
  111. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_manual.py +0 -0
  112. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_pages_ui.py +0 -0
  113. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_routing.py +0 -0
  114. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_service_recipe.py +0 -0
  115. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_task_recipe.py +0 -0
  116. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_teach.py +0 -0
  117. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/builtin_recipes.md +0 -0
  118. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/ellf_recipe_sdk.md +0 -0
  119. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/lint_recipe.py +0 -0
  120. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/prodigy_recipe_api.md +0 -0
  121. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/template_index.md +0 -0
  122. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-project/SKILL.assistant.md +0 -0
  123. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-project/SKILL.coding.md +0 -0
  124. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-project/references/annotation_agents.md +0 -0
  125. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-project/references/consulting_patterns.md +0 -0
  126. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-project/references/explosion_strategy.md +0 -0
  127. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.assistant.md +0 -0
  128. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.coding.md +0 -0
  129. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-support/SKILL.assistant.md +0 -0
  130. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-support/SKILL.coding.md +0 -0
  131. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-todo/SKILL.coding.md +0 -0
  132. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-train/SKILL.assistant.md +0 -0
  133. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-train/SKILL.coding.md +0 -0
  134. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-train/references/config_advanced.coding.md +0 -0
  135. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-train/references/config_architectures.coding.md +0 -0
  136. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-train/references/config_training.coding.md +0 -0
  137. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-train/references/diagnostics.md +0 -0
  138. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-train/references/evaluation_guide.md +0 -0
  139. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-train/references/experiment_patterns.coding.md +0 -0
  140. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-train/references/model_selection.md +0 -0
  141. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-train/references/training_paradigms.md +0 -0
  142. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-train/references/training_troubleshooting.coding.md +0 -0
  143. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-train/references/workflow.assistant.md +0 -0
  144. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-train/references/workflow.coding.md +0 -0
  145. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ellf_skills/skills/ellf-train/scripts.coding/ellf_logger.py +0 -0
  146. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/errors.py +0 -0
  147. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/helm.py +0 -0
  148. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/interactivity.py +0 -0
  149. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/key_pair.py +0 -0
  150. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/main.py +0 -0
  151. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/mcp_proxy.py +0 -0
  152. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/pypi_auth.py +0 -0
  153. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/query.py +0 -0
  154. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/recipes_cookiecutter/cookiecutter.json +0 -0
  155. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/.gitignore +0 -0
  156. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/README.md.tmpl +0 -0
  157. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements-dev.in +0 -0
  158. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements.in +0 -0
  159. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/setup.py.tmpl +0 -0
  160. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/__init__.py +0 -0
  161. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/about.py +0 -0
  162. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/__init__.py +0 -0
  163. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/example_task.py +0 -0
  164. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/testing/__init__.py +0 -0
  165. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ty.py +0 -0
  166. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/ui.py +0 -0
  167. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/url.py +0 -0
  168. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/util.py +0 -0
  169. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.114_2026-08-19-08-36-57__1a4e37c1-471e-4a81-b4d5-1ffe7dec3a61 +0 -0
  170. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.114_2026-08-19-09-25-21_patch_33ff1e26-0e5e-46d8-8052-ab1d032e8b6c +0 -0
  171. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.115_2026-08-19-09-27-13_patch_4ac728c3-0342-4a36-adbc-e28d2d99b1ba +0 -0
  172. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.116_2026-08-19-09-30-47_patch_c706fef6-6813-4183-b268-12e7b00d7d0b +0 -0
  173. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.117_2026-08-19-09-39-14_patch_c6b0495f-2f88-4aa8-9ebf-0a235b4c407e +0 -0
  174. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.118_2026-08-19-09-52-00_patch_b395655a-8d78-4344-9266-6901c20f6517 +0 -0
  175. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.119_2026-08-19-10-22-38_patch_8f95c49d-aedc-41b8-816d-ccb95f048831 +0 -0
  176. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.120_2026-08-19-10-26-58_patch_7fbf35e6-cc01-4b75-8c9a-f5d054bcaf93 +0 -0
  177. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.121_2026-08-19-10-42-02_patch_31a81b02-a886-4dea-84e0-67cc6ca412d5 +0 -0
  178. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.122_2026-08-19-11-16-49_patch_1c4d7307-48d4-493e-936d-80af799d644b +0 -0
  179. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.123_2026-08-19-11-47-32_patch_d3d78d04-9989-45b1-91b1-93b571d8814a +0 -0
  180. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.124_2026-08-20-08-03-17_patch_57f4c389-2d19-41ce-aca4-13b61c62f387 +0 -0
  181. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.125_2026-08-20-08-25-05_patch_7f368148-0d1c-4525-bbdf-c6d257ad861a +0 -0
  182. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.126_2026-08-20-14-51-36_patch_a99abcc8-3371-4c63-a759-bb7ea5b32432 +0 -0
  183. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.127_2026-08-21-05-48-58_patch_34b4ccee-7596-4f57-93e9-774973cca58e +0 -0
  184. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.128_2026-08-21-10-47-20_patch_693112b9-927c-4a8f-8553-b06eef86079d +0 -0
  185. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.129_2026-08-21-11-16-54_patch_7a981666-01d9-4d1b-9ba3-2129744e3bd5 +0 -0
  186. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.130_2026-08-21-13-09-36_patch_b7ad1a76-ce70-4d70-9d1a-7c414eba5bb4 +0 -0
  187. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.131_2026-08-21-14-31-10_patch_9128ef66-193e-4caf-8710-afd86128e638 +0 -0
  188. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.132_2026-08-24-08-59-34_patch_c600fc14-86a5-460f-9c4e-f0177056f756 +0 -0
  189. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.133_2026-08-24-10-28-29_patch_b6ce3e32-9d7b-48ac-981a-270c22c180dd +0 -0
  190. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.134_2026-08-24-11-00-51_patch_a4fc0484-4a64-46a2-94f8-aa805254c7b0 +0 -0
  191. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.135_2026-08-24-12-12-41_patch_a870a56f-9a65-49eb-92da-f572b26667d8 +0 -0
  192. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.136_2026-08-24-12-42-46_patch_9b399356-6482-4291-8da7-e748a99c4b53 +0 -0
  193. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.137_2026-08-24-12-53-57_patch_f7979348-1910-40cd-a535-90299eca84ee +0 -0
  194. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.138_2026-08-24-14-36-30_patch_ed0f8750-f663-498b-85e7-0d3f2213fcfe +0 -0
  195. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.139_2026-08-25-08-37-26_patch_3ba87e19-902b-4f76-b64c-90e5c0ca1fc6 +0 -0
  196. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.140_2026-08-25-09-52-45_patch_abc830f2-df15-4385-b797-cdaf72c10752 +0 -0
  197. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.141_2026-08-25-11-37-20_patch_1d9ec01e-06f6-4c8e-b095-af17d5b62b00 +0 -0
  198. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.142_2026-08-26-07-38-49_patch_3dd23e36-e7df-494c-986f-a412861a8d40 +0 -0
  199. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.143_2026-08-26-09-32-32_patch_7b7ebd34-de27-4b73-98a7-3e1501e16cd5 +0 -0
  200. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.144_2026-08-26-10-56-43_patch_166064f2-2208-4c9b-9e25-25dc4cd32084 +0 -0
  201. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.145_2026-08-26-11-37-29_patch_b997f3ee-d7d3-4408-9f2f-c8b6d08bdb3b +0 -0
  202. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.146_2026-08-26-12-15-20_patch_afbbb893-25db-468c-81db-2663ca373068 +0 -0
  203. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.147_2026-08-26-14-10-50_patch_fd753b1f-2fa1-4ddb-a9e7-de690da85254 +0 -0
  204. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.148_2026-08-27-09-08-35_patch_23814c0b-7f77-489c-b4a8-ceadd18146e3 +0 -0
  205. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.149_2026-08-27-09-40-17_patch_8879d72e-a3d8-4abc-a16a-d9dcf75f0fa1 +0 -0
  206. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.150_2026-08-27-10-57-25_patch_afbe60ed-3e23-4d88-be3c-f800d7002a7d +0 -0
  207. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.151_2026-08-28-09-02-46_patch_1d4ca23b-aeae-4ea8-96b1-8cf57371f29d +0 -0
  208. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.152_2026-08-28-15-37-24_patch_c9d0bdc1-a7e1-432b-92b9-92dc76fe0c78 +0 -0
  209. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.153_2026-08-29-09-03-27_patch_7531573a-1b33-4092-aa9c-0e65f47b201f +0 -0
  210. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.154_2026-08-29-11-56-35_patch_919f5787-39c8-4dc1-ae6a-f27c28380f21 +0 -0
  211. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.155_2026-08-29-15-15-59_patch_822f9ed8-c366-4e5f-9791-dee8467cf3ce +0 -0
  212. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.156_2026-08-29-16-19-01_patch_3ac2bf36-20f7-4c9f-9fdb-295d4466d59e +0 -0
  213. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.157_2026-08-30-17-32-17_patch_4302354c-c9c5-4be7-acd3-542872a748d8 +0 -0
  214. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.158_2026-08-31-09-28-33_patch_3523774f-c25d-4102-8c1a-92fff046a48d +0 -0
  215. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.159_2026-08-31-10-31-01_patch_fe3e6290-2553-4154-a0a0-8b8a418280ed +0 -0
  216. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.160_2026-08-31-11-23-39_patch_e701a085-3d23-4212-b0af-73b1d419a4c1 +0 -0
  217. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.161_2026-08-31-12-41-01_patch_074d7bde-c493-44db-bc15-e81fd91e2921 +0 -0
  218. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.162_2026-08-31-13-58-06_patch_84db1d60-4280-433b-bd3a-22e5611cd315 +0 -0
  219. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.163_2026-08-31-15-25-54_patch_1931c5ba-73df-48cb-8dcb-555ace0af267 +0 -0
  220. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.163_2026-08-31-15-44-37_patch_3962e805-2a92-494a-a87b-b6e6d66c40a0 +0 -0
  221. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.165_2026-08-31-19-48-59_patch_86e5b923-2b99-4b86-b542-469b197614be +0 -0
  222. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.166_2026-09-01-07-39-57_patch_c344892f-d542-4e7b-8f27-02365a411e15 +0 -0
  223. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.167_2026-09-01-08-21-53_patch_e199d419-282a-4dbb-8756-cf98b7037e2b +0 -0
  224. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.168_2026-09-01-09-12-31_patch_235c9fe0-da15-431d-bb56-01e2b9b15f4b +0 -0
  225. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.169_2026-09-01-11-54-19_patch_98b617ab-d130-42b5-93f2-19cae56d4c4c +0 -0
  226. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.170_2026-09-02-09-27-28_patch_e448d2e6-b7ec-4235-96bf-0173b3623c87 +0 -0
  227. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.171_2026-09-02-12-52-44_patch_e6a241c2-1d62-482c-a9eb-9e3373395c50 +0 -0
  228. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.172_2026-09-04-08-47-04_patch_daae079f-c104-4fcd-bb57-7bff68e80ad9 +0 -0
  229. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.173_2026-09-04-12-34-42_patch_399c4cbd-0c28-4dfd-a4ec-e569420a36e4 +0 -0
  230. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.174_2026-09-04-13-08-48_patch_f5cfe3d5-808e-45e4-bafc-00d0554838ee +0 -0
  231. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.175_2026-09-04-17-20-46_patch_1ef542fa-5d8e-4d90-aa15-9fc4cea3dfec +0 -0
  232. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.176_2026-09-05-08-25-05_patch_ced5521f-f9da-4640-a921-95fcb5cd2e6d +0 -0
  233. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.177_2026-09-05-09-00-16_patch_803c1ad4-a9af-4953-92c5-d882dec03ea2 +0 -0
  234. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.178_2026-09-05-09-30-34_patch_012f6259-2e3f-4591-9806-1920fd06cb1f +0 -0
  235. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.179_2026-09-05-09-33-43_patch_f4bdf28c-d584-47a5-b699-8c883330162c +0 -0
  236. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.180_2026-09-05-12-02-21_patch_34a14b01-d22d-44a8-ac63-be0370a61422 +0 -0
  237. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.181_2026-09-05-12-47-46_patch_56b18867-99f6-4d5c-8215-7b9d60d34010 +0 -0
  238. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.182_2026-09-05-13-35-18_patch_61b7d4d1-73c8-4603-9b0c-593e7405587f +0 -0
  239. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.183_2026-09-06-07-27-09_patch_d76331b2-e3a3-4c0b-8412-ecd131b6ac02 +0 -0
  240. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.184_2026-09-06-10-21-47_patch_7680b7a1-49f0-4eef-b12e-4c854407448c +0 -0
  241. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.185_2026-09-06-10-30-40_patch_e56c2183-77f8-44ef-a92e-7377ea6ce8c1 +0 -0
  242. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.186_2026-09-07-10-00-51_patch_67de5683-d208-4bc0-8fb6-7677377908e7 +0 -0
  243. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.187_2026-09-07-10-18-13_patch_2086cee2-276b-48f7-80ce-6a17397b9541 +0 -0
  244. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.188_2026-09-07-12-51-28_patch_d6590822-068f-4a19-814d-34bbf204ba6e +0 -0
  245. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.189_2026-09-07-12-55-23_patch_7e0fb04b-4d40-4490-974f-c74ba2ae55a1 +0 -0
  246. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.190_2026-09-08-08-58-03_patch_15e3ac1e-4475-4272-bdd8-d00bb0db8f17 +0 -0
  247. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.191_2026-09-08-09-55-58_patch_3d350e50-ee53-4282-bc75-d2251142c46e +0 -0
  248. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.192_2026-09-08-11-12-21_patch_0733223b-1ae2-4b5b-897f-dfc57574ff83 +0 -0
  249. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.193_2026-09-08-21-48-17_patch_8d07d4e6-3555-4720-85c9-9452570fae2d +0 -0
  250. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.194_2026-09-09-07-53-43_patch_69559429-aa42-4b62-9bd7-cdfded1c00d0 +0 -0
  251. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.195_2026-09-09-09-55-40_patch_bbf67f1d-3b9a-43a2-b1bc-22df3fed8a34 +0 -0
  252. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.196_2026-09-09-09-59-47_patch_70d76812-7b3c-4192-ad49-fcaccc29b0da +0 -0
  253. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.197_2026-09-09-13-06-06_patch_d455be0b-5421-492a-b952-fab0fd8110f8 +0 -0
  254. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.198_2026-09-09-13-14-34_patch_267f54e5-311e-435e-882f-8e19191325ea +0 -0
  255. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.199_2026-09-09-22-24-18_patch_81e3e453-ca0e-42fa-9c21-8f94d43c05f2 +0 -0
  256. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.200_2026-09-10-07-19-50_patch_911714fa-1fa3-4165-bfe6-d10c650bf5bf +0 -0
  257. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.201_2026-09-10-10-14-19_patch_864015f2-b0b0-4563-a1c8-155629cb9126 +0 -0
  258. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.202_2026-09-10-11-00-05_patch_18270ecf-e770-4e69-8bcf-e5143c39929b +0 -0
  259. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.203_2026-09-10-11-10-41_patch_ff273ab1-44f3-4bc0-b184-3396e943df04 +0 -0
  260. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.204_2026-09-10-13-02-02_patch_d4ee41e2-d13c-4941-8605-3f1a42b56b22 +0 -0
  261. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.205_2026-09-10-13-57-50_patch_284df67e-5957-4b0c-bc64-5581db6ddecc +0 -0
  262. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.206_2026-09-11-10-18-50_patch_1ac7e410-0e62-4eef-bbe4-ebf93c9d0869 +0 -0
  263. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/17.0.207_2026-09-11-15-26-02_major_3f1b3ed7-eaac-41f5-b740-0af3331595d9 +0 -0
  264. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.0_2026-09-12-10-01-10_patch_8995783a-a9fa-4c4e-90b3-6386a4c481eb +0 -0
  265. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.10_2026-09-14-16-09-38_patch_9403d562-eed0-4125-a8b3-09cd92a13298 +0 -0
  266. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.11_2026-09-15-09-05-57_patch_8b22dba2-d931-4c4d-ae60-db3238d5e73d +0 -0
  267. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.12_2026-09-15-11-18-52_patch_81314afa-e70d-4ad8-b45b-3f8d62b983e7 +0 -0
  268. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.13_2026-09-16-08-00-55_patch_bfa30fc0-3281-4de6-bb56-d7290c98d1c3 +0 -0
  269. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.14_2026-09-16-14-38-26_patch_aae6e9b0-88f4-4bcf-b611-3308c7fcd6eb +0 -0
  270. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.15_2026-09-17-07-58-54_patch_43d40582-effd-4925-a8bd-e70fecf1faab +0 -0
  271. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.16_2026-09-17-08-12-37_patch_b4db2d23-88f1-45c1-82d9-78d38014fcb6 +0 -0
  272. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.17_2026-09-18-09-38-19_patch_25697fc3-e9a8-4980-962b-e6cb0a4760c5 +0 -0
  273. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.18_2026-09-18-09-54-33_patch_d37d9c71-c469-4d94-90d7-4898915ee991 +0 -0
  274. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.19_2026-09-18-10-47-33_patch_47607b3c-d1b6-4864-b9b0-00a2a8d2ac32 +0 -0
  275. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.1_2026-09-12-17-33-30_patch_f6ea2c99-a715-4c4d-876a-23ed8c62a83d +0 -0
  276. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.20_2026-09-18-11-07-21_patch_5a336f91-63a6-4877-97ed-da89395cc8f5 +0 -0
  277. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.21_2026-09-18-13-34-52_patch_c56462e1-63d9-498f-a912-c80c5f0171d1 +0 -0
  278. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.22_2026-09-20-08-10-45_patch_6afa2c20-bcef-4b7d-8685-2c9815d8683f +0 -0
  279. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.23_2026-09-20-08-38-35_patch_a7f169e5-37ab-4ec0-bf89-d14770181303 +0 -0
  280. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.24_2026-09-20-15-49-27_patch_c1222081-ff44-4f20-aea2-5840b6d76efd +0 -0
  281. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.25_2026-09-21-06-11-40_patch_6df46dd9-e7d3-4e71-bec4-e5c93b4ac863 +0 -0
  282. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.26_2026-09-21-07-54-11_patch_cc52dd36-5eba-4094-a1b0-d6f79f103441 +0 -0
  283. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.27_2026-09-21-08-36-49_patch_a25fa125-9bcd-4317-8da5-851c1c329631 +0 -0
  284. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.28_2026-09-21-09-44-01_patch_4430a721-0b3c-4f6a-b9bc-a53e667161bb +0 -0
  285. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.29_2026-09-21-10-58-07_patch_83b2b942-60a4-4bef-afd1-99690ba52b69 +0 -0
  286. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.2_2026-09-13-06-36-33_patch_176bb944-1c49-4dd3-a001-8fce908825a0 +0 -0
  287. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.30_2026-09-21-12-51-16_patch_519b9a65-d400-4234-b113-36b46e315507 +0 -0
  288. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.31_2026-09-22-06-53-35_patch_5c45a235-81b6-4d05-801a-07dc7db61400 +0 -0
  289. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.32_2026-09-22-07-42-04_patch_f12c6415-8166-4063-9e5d-26601b929d63 +0 -0
  290. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.33_2026-09-22-08-12-32_patch_cec31bb0-a6cb-43e6-8407-25aba322b54c +0 -0
  291. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.34_2026-09-23-07-09-16_patch_659fccbb-c0a0-4f6f-bc87-e6abaa8815a7 +0 -0
  292. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.35_2026-09-23-09-38-52_patch_023f904d-807a-4833-8a40-570365e8ec06 +0 -0
  293. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.36_2026-09-23-10-05-33_patch_846fb491-2b1b-47ed-ac1f-ba40e744e199 +0 -0
  294. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.37_2026-09-23-13-08-30_patch_8e4b1d24-156e-4ffe-8e4a-b8740ec18588 +0 -0
  295. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.38_2026-09-24-06-41-37_patch_67adb1d6-3f49-4357-a67f-b1d48f23a972 +0 -0
  296. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.39_2026-09-24-15-24-32_patch_e5dd375d-5643-4514-9b65-8d877c4a2bb2 +0 -0
  297. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.3_2026-09-13-12-32-46_patch_58e5ce3a-f2a7-4789-b2cd-5cc75c72b6ec +0 -0
  298. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.40_2026-09-24-19-58-14_patch_ff18824b-be51-4a3d-a621-e96279e53c3e +0 -0
  299. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.41_2026-09-26-09-24-52_patch_b9979267-30f9-440a-a4ce-c611991d4886 +0 -0
  300. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.42_2026-09-28-12-39-34_patch_dda535d9-8922-4eb9-ab51-6ecff0650c10 +0 -0
  301. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.43_2026-09-28-13-35-27_minor_aca1168a-1286-4326-9d0c-2f2587c9fe92 +0 -0
  302. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.4_2026-09-13-12-45-14_patch_b6c79d55-8f85-4f47-a304-df52b122c38c +0 -0
  303. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.5_2026-09-13-14-11-18_patch_9b111116-5e62-472a-b72c-d1bbafa22c97 +0 -0
  304. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.5_2026-09-13-17-01-11_patch_d4bf61c0-83ac-4dd3-b512-a65805d298c8 +0 -0
  305. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.6_2026-09-14-11-31-04_patch_fd2ebda6-22cb-4e7d-9452-2f6f2640e828 +0 -0
  306. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.7_2026-09-13-17-06-08_patch_428af161-0b27-43c2-8751-e5f7874df120 +0 -0
  307. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.0.9_2026-09-14-12-37-42_patch_b2ca0529-4b67-4fa4-8fdc-5f5e9f5d5166 +0 -0
  308. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.1.0_2026-09-28-14-27-54_patch_324444f7-d24e-4189-b21f-1188894a3109 +0 -0
  309. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/18.1.1_2026-09-28-21-03-07_major_e266a14a-7d96-4ece-92a3-8f34e64438a5 +0 -0
  310. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.0_2026-09-29-11-05-31_patch_77d6f9f8-ead3-4d79-a4b2-b084b2dffc98 +0 -0
  311. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.10_2026-10-02-12-56-52_patch_14e97576-73ca-44b8-82c9-7dad6f1789ab +0 -0
  312. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.11_2026-10-04-10-31-19_patch_088eb371-1799-4949-a119-286cf1cd55d1 +0 -0
  313. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.12_2026-10-06-18-00-25_patch_36554bed-49c5-41cb-9fd4-48cc6af74c09 +0 -0
  314. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.13_2026-10-07-12-24-08_patch_a540a364-3a0d-4960-b278-06ba2c7cc258 +0 -0
  315. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.14_2026-10-07-12-52-39_patch_e3a6fc5c-2ee4-414c-a2dd-4910a655a7dd +0 -0
  316. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.15_2026-10-09-04-15-56_patch_bd7a9b06-867b-4fea-9678-973a05e3022d +0 -0
  317. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.16_2026-10-09-16-11-56_patch_a1135435-7dea-4f00-8c98-203ba3974382 +0 -0
  318. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.17_2026-10-09-17-44-55_patch_faeacad8-541a-40f2-ab9c-abcd66fcd00e +0 -0
  319. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.18_2026-10-10-07-29-38_major_02601a1e-9bdb-45bf-ad67-a07b7dcd0002 +0 -0
  320. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.1_2026-09-29-11-59-38_patch_bbf4753c-d641-4c2f-ac7c-02be6bd8e7c2 +0 -0
  321. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.2_2026-09-29-12-44-07_patch_19fdaa94-60dc-464b-93b8-c17607ebc7b6 +0 -0
  322. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.3_2026-09-29-14-16-00_patch_3cb60272-95cf-4311-8897-721e1b5c2c88 +0 -0
  323. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.4_2026-09-29-16-24-53_patch_9fe8ad2b-e3ec-4558-a5fc-9c44c5c266dc +0 -0
  324. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.5_2026-09-29-17-13-16_patch_e48d2dd2-f41a-402e-a441-756b23c01dcb +0 -0
  325. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.6_2026-09-29-17-22-11_patch_3b1c79e9-9002-4e96-ba78-10668c33be6a +0 -0
  326. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.7_2026-09-30-07-50-58_patch_e8b1f046-d819-499c-9cd5-3e1a20fc9acf +0 -0
  327. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.8_2026-10-01-13-41-44_patch_7d63af18-e0af-4127-ab58-aede2407490f +0 -0
  328. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/19.0.9_2026-10-01-15-57-35_patch_143863cb-8f63-4ef7-bd78-c1114fc93a2d +0 -0
  329. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/20.0.0_2026-10-10-09-36-17_patch_d2618f39-cdc9-4d3a-ba40-1a0ad6265f3b +0 -0
  330. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/20.0.1_2026-10-11-10-24-33_patch_e29a8713-eecb-4eb1-9641-789d3cfab21a +0 -0
  331. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/20.0.2_2026-10-12-07-22-24_patch_f4053ad1-8fcd-4591-a68d-bf1e23485ba7 +0 -0
  332. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/20.0.3_2026-10-14-14-29-16_patch_070af1c4-f9d9-4f97-8112-058de90d3ea8 +0 -0
  333. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/20.0.4_2026-10-14-16-20-24_patch_c6672844-8227-4e0a-9fb5-36af7e7141dc +0 -0
  334. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/20.0.5_2026-10-15-08-53-28_patch_10154146-8afd-4632-b250-9b4b9f5bf67c +0 -0
  335. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/20.0.6_2026-10-15-14-17-40_patch_df3a5d3c-f0e0-46cb-aeaf-15b51c8a0f13 +0 -0
  336. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/__init__.py +0 -0
  337. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli/version/read_version.py +0 -0
  338. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli.egg-info/dependency_links.txt +0 -0
  339. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli.egg-info/entry_points.txt +0 -0
  340. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli.egg-info/not-zip-safe +0 -0
  341. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli.egg-info/requires.txt +0 -0
  342. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/ellf_cli.egg-info/top_level.txt +0 -0
  343. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/pyproject.toml +0 -0
  344. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/setup.cfg +0 -0
  345. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/setup.py +0 -0
  346. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_agents_info_stats.py +0 -0
  347. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_appdirs.py +0 -0
  348. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_auth.py +0 -0
  349. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_clusters_info_stats.py +0 -0
  350. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_config.py +0 -0
  351. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_datasets_export.py +0 -0
  352. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_errors.py +0 -0
  353. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_files_cp.py +0 -0
  354. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_files_cp_helpers.py +0 -0
  355. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_helm.py +0 -0
  356. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_import_export.py +0 -0
  357. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_info.py +0 -0
  358. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_infra_config_io.py +0 -0
  359. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_infra_configure.py +0 -0
  360. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_infra_deploy_node_labels.py +0 -0
  361. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_infra_destroy.py +0 -0
  362. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_infra_get_terraform.py +0 -0
  363. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_infra_hibernate.py +0 -0
  364. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_infra_init.py +0 -0
  365. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_infra_pause.py +0 -0
  366. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_infra_provision.py +0 -0
  367. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_infra_start_fixes.py +0 -0
  368. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_infra_start_validation.py +0 -0
  369. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_infra_state_bucket.py +0 -0
  370. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_infra_terraform_init.py +0 -0
  371. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_invalid_secrets.py +0 -0
  372. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_job_list_project_filter.py +0 -0
  373. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_jobs_info_hides_creator.py +0 -0
  374. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_jobs_list_unmatched.py +0 -0
  375. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_key_pair.py +0 -0
  376. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_login.py +0 -0
  377. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_logout.py +0 -0
  378. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_main.py +0 -0
  379. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_mcp_proxy.py +0 -0
  380. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_org_select.py +0 -0
  381. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_plans.py +0 -0
  382. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_projects.py +0 -0
  383. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_projects_delete_confirm.py +0 -0
  384. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_publish_build_poll.py +0 -0
  385. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_publish_data.py +0 -0
  386. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_publish_import_root.py +0 -0
  387. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_publish_requirements.py +0 -0
  388. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_publish_versions.py +0 -0
  389. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_pypi_auth.py +0 -0
  390. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_query.py +0 -0
  391. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_recipe_file.py +0 -0
  392. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_recipe_required_args.py +0 -0
  393. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_recipes.py +0 -0
  394. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_sessions.py +0 -0
  395. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_state.py +0 -0
  396. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_support.py +0 -0
  397. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_todos.py +0 -0
  398. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_ty.py +0 -0
  399. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_ui.py +0 -0
  400. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_ui_extras.py +0 -0
  401. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_usage_counts.py +0 -0
  402. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_users_assign.py +0 -0
  403. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_users_info_stats.py +0 -0
  404. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_users_list.py +0 -0
  405. {ellf_cli-20.0.7 → ellf_cli-21.0.1}/tests/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 20.0.7
3
+ Version: 21.0.1
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
@@ -1679,7 +1679,7 @@ Log in to your Ellf account. You normally don't need to call this manually. It w
1679
1679
  | `--org` | `str` | Name or ID of the organization to log into. If omitted: auto-select when only one is available, or prompt interactively | `None` |
1680
1680
  | `--cluster` | `str` | Name or ID of the cluster to log into. If omitted: auto-select when only one is available, or prompt interactively | `None` |
1681
1681
  | `--json` | `bool` | Output the result as JSON | `False` |
1682
- | `--agent` | `str` | Set up coding agents to work with Ellf: install the Ellf skills and the knowledge base MCP server. One of claude, codex, opencode, copilot; repeat the option or comma-separate them for several | `None` |
1682
+ | `--agent` | `str` | Set up coding agents to work with Ellf: install the Ellf skills and the knowledge base MCP server. One of claude, codex, copilot, junie, opencode; repeat the option or comma-separate them for several | `None` |
1683
1683
  | `--claude` | `bool` | Shortcut for --agent claude | `False` |
1684
1684
 
1685
1685
  ### `ellf logout`
@@ -12,12 +12,13 @@ from pathlib import Path
12
12
  from types import ModuleType
13
13
  from typing import Any, Callable, Optional, Union
14
14
 
15
- AGENTS = ("claude", "codex", "opencode", "copilot")
15
+ AGENTS = ("claude", "codex", "copilot", "junie", "opencode")
16
16
  AGENT_NAMES = {
17
17
  "claude": "Claude Code",
18
18
  "codex": "Codex",
19
- "opencode": "OpenCode",
20
19
  "copilot": "GitHub Copilot",
20
+ "junie": "Junie",
21
+ "opencode": "OpenCode",
21
22
  }
22
23
  MCP_SERVER_NAME = "ellf-kb"
23
24
 
@@ -39,6 +40,10 @@ def _copilot_home() -> Path:
39
40
  return _env_dir("COPILOT_HOME", _home() / ".copilot")
40
41
 
41
42
 
43
+ def _junie_home() -> Path:
44
+ return _env_dir("JUNIE_HOME", _home() / ".junie")
45
+
46
+
42
47
  def _opencode_config_dir() -> Path:
43
48
  return _env_dir("XDG_CONFIG_HOME", _home() / ".config") / "opencode"
44
49
 
@@ -55,7 +60,7 @@ def skills_dirs(agent: str) -> list[Path]:
55
60
  """The user-level skill directories an agent reads ellf skills from."""
56
61
  if agent == "claude":
57
62
  return [_home() / ".claude" / "skills"]
58
- # Codex, OpenCode and Copilot (CLI and VS Code) all read ~/.agents/skills.
63
+ # Codex, Copilot (CLI and VS Code), Junie and OpenCode all read ~/.agents/skills.
59
64
  dirs = [_home() / ".agents" / "skills"]
60
65
  if agent == "copilot" and os.environ.get("COPILOT_HOME"):
61
66
  # Copilot CLI stops reading ~/.agents/skills when COPILOT_HOME is set.
@@ -271,6 +276,14 @@ def _configure_copilot_cli(command: list[str]) -> Path:
271
276
  return path
272
277
 
273
278
 
279
+ def _configure_junie(command: list[str]) -> Path:
280
+ # The Junie CLI and the JetBrains IDE plugin share this file.
281
+ path = _junie_home() / "mcp" / "mcp.json"
282
+ entry = {"command": command[0], "args": command[1:]}
283
+ _set_json_entry(path, ("mcpServers", MCP_SERVER_NAME), entry)
284
+ return path
285
+
286
+
274
287
  def _configure_vscode(command: list[str]) -> Optional[Path]:
275
288
  # VS Code keeps its own user mcp.json; only touch it when VS Code is there.
276
289
  vscode_dir = _vscode_user_dir()
@@ -285,8 +298,9 @@ def _configure_vscode(command: list[str]) -> Optional[Path]:
285
298
  _MCP_CONFIGURERS: dict[str, list[Callable[[list[str]], Optional[Path]]]] = {
286
299
  "claude": [_configure_claude],
287
300
  "codex": [_configure_codex],
288
- "opencode": [_configure_opencode],
289
301
  "copilot": [_configure_copilot_cli, _configure_vscode],
302
+ "junie": [_configure_junie],
303
+ "opencode": [_configure_opencode],
290
304
  }
291
305
 
292
306
 
@@ -328,7 +342,7 @@ _SESSION_ENV_VARS = (
328
342
 
329
343
  def current_session() -> Optional[AgentSession]:
330
344
  """The agent session this process runs in, from the variables agents set
331
- for the commands they run. OpenCode sets none.
345
+ for the commands they run. Junie and OpenCode set none.
332
346
 
333
347
  An agent started from another agent's shell inherits the outer agent's
334
348
  variables too, and nothing says which one is running this command. Rather
@@ -214,7 +214,41 @@ def k3s_traefik_exists() -> bool:
214
214
  return result.returncode == 0
215
215
 
216
216
 
217
- def ensure_traefik(public_ip: str = "") -> None:
217
+ def traefik_values(
218
+ public_ip: str = "", port: int | None = None, tls: bool = False
219
+ ) -> dict:
220
+ """Helm values for the Traefik install. *port* adds an entrypoint for a
221
+ cluster reached on a port other than 80/443 (e.g. localhost:8443 on
222
+ Colima, which forwards each port the VM listens on to the same port on
223
+ the Mac)."""
224
+ ports: dict = {"web": {"port": 80}, "websecure": {"port": 443}}
225
+ if port is not None and port not in (80, 443):
226
+ ports["ellf"] = {
227
+ "port": port,
228
+ "exposedPort": port,
229
+ "expose": {"default": True},
230
+ "protocol": "TCP",
231
+ "tls": {"enabled": tls},
232
+ }
233
+ values: dict = {
234
+ "providers": {
235
+ "kubernetesIngress": {"enabled": True},
236
+ },
237
+ "ingressRoute": {"dashboard": {"enabled": False}},
238
+ "ports": ports,
239
+ "securityContext": {
240
+ "capabilities": {"drop": [], "add": ["NET_BIND_SERVICE"]},
241
+ },
242
+ "tolerations": SYSTEM_NODE_TOLERATIONS,
243
+ }
244
+ if public_ip:
245
+ values["service"] = {"spec": {"loadBalancerIP": public_ip}}
246
+ return values
247
+
248
+
249
+ def ensure_traefik(
250
+ public_ip: str = "", port: int | None = None, tls: bool = False
251
+ ) -> None:
218
252
  """Install or upgrade Traefik via Helm."""
219
253
  if k3s_traefik_exists():
220
254
  msg.info(
@@ -233,19 +267,7 @@ def ensure_traefik(public_ip: str = "") -> None:
233
267
  capture_output=True,
234
268
  text=True,
235
269
  )
236
- values: dict = {
237
- "providers": {
238
- "kubernetesIngress": {"enabled": True},
239
- },
240
- "ingressRoute": {"dashboard": {"enabled": False}},
241
- "ports": {"web": {"port": 80}, "websecure": {"port": 443}},
242
- "securityContext": {
243
- "capabilities": {"drop": [], "add": ["NET_BIND_SERVICE"]},
244
- },
245
- "tolerations": SYSTEM_NODE_TOLERATIONS,
246
- }
247
- if public_ip:
248
- values["service"] = {"spec": {"loadBalancerIP": public_ip}}
270
+ values = traefik_values(public_ip, port, tls)
249
271
  with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False) as tmp:
250
272
  tmp.write(json.dumps(values))
251
273
  tmp_path = tmp.name
@@ -24,11 +24,14 @@ from ...helm import (
24
24
  user_registry_of,
25
25
  )
26
26
  from ...key_pair import generate_key_pair
27
+ from ...url import URL
27
28
  from .._state import get_auth_state
28
- from ._helpers import create_image_pull_secret, helm_registry_login
29
+ from ._config_io import FILL_IN
30
+ from ._helpers import create_image_pull_secret, ensure_traefik, helm_registry_login
29
31
 
30
32
  DEFAULT_NAMESPACE = "ellf"
31
33
  DEFAULT_RELEASE = "ellf"
34
+ DEFAULT_INGRESS_CLASS = "traefik"
32
35
 
33
36
 
34
37
  @cli.subcommand(
@@ -62,6 +65,18 @@ def deploy(
62
65
  # key, wrong type, missing required field) fails right here, before any of
63
66
  # the side effects below touch the cluster or PAM.
64
67
  overrides = HelmChartOverrides(**values_dict)
68
+ placeholders = _placeholder_keys(values_dict)
69
+ if placeholders:
70
+ msg.fail(
71
+ f"{values_file} still has FILL-IN placeholders: {', '.join(placeholders)}"
72
+ )
73
+ if "registries.user" in placeholders:
74
+ msg.text(
75
+ "registries.user is a registry this cluster can push custom "
76
+ "recipe images to. On a single-node cluster, delete it and set "
77
+ "localRegistry.enabled: true to use the chart's own registry."
78
+ )
79
+ raise SystemExit(1)
65
80
  # Image versions are dynamic state owned by PAM's cluster settings.
66
81
  # They are injected into the helm invocation here and deliberately
67
82
  # never written back to values.yaml.
@@ -166,7 +181,10 @@ def deploy(
166
181
  )
167
182
  )
168
183
  msg.good("Registered cluster public key with PAM")
169
- # 5. Helm upgrade --install
184
+ # 5. Without an ingress controller nothing serves the cluster's domain.
185
+ # k3s bundles Traefik, but Colima (and k3s --disable traefik) turn it off.
186
+ _ensure_ingress_controller(overrides)
187
+ # 6. Helm upgrade --install
170
188
  if chart is None:
171
189
  # Use OCI chart from the registry
172
190
  if not registry:
@@ -182,7 +200,7 @@ def deploy(
182
200
  else:
183
201
  msg.info(f"Installing from local chart {chart}...")
184
202
  upgrade(chart, overrides, namespace=namespace, wait=wait)
185
- # 6. Every worker type pins jobs to nodes labeled ellf/node-class=<node_class>.
203
+ # 7. Every worker type pins jobs to nodes labeled ellf/node-class=<node_class>.
186
204
  # Cloud node pools get that label from terraform; a hand-built cluster (k3s
187
205
  # on a workstation) doesn't, and every job then sits Pending with "didn't
188
206
  # match Pod's node affinity/selector". Read the types the chart actually
@@ -195,6 +213,55 @@ def deploy(
195
213
  preflight_test(release=DEFAULT_RELEASE, namespace=namespace)
196
214
 
197
215
 
216
+ def _placeholder_keys(values: object, prefix: str = "") -> list[str]:
217
+ """Dotted paths of the values ``infra init-values`` left as FILL-IN."""
218
+ if isinstance(values, dict):
219
+ return [
220
+ key
221
+ for name, value in values.items()
222
+ for key in _placeholder_keys(value, f"{prefix}{name}.")
223
+ ]
224
+ if isinstance(values, list):
225
+ return [
226
+ key
227
+ for i, value in enumerate(values)
228
+ for key in _placeholder_keys(value, f"{prefix}{i}.")
229
+ ]
230
+ if isinstance(values, str) and FILL_IN in values:
231
+ return [prefix.rstrip(".")]
232
+ return []
233
+
234
+
235
+ def _ensure_ingress_controller(overrides: HelmChartOverrides) -> None:
236
+ """Install Traefik when the chart's IngressClass doesn't exist yet,
237
+ listening on the cluster domain's port as well as 80/443."""
238
+ class_name = (
239
+ overrides.ingress.class_name if overrides.ingress else None
240
+ ) or DEFAULT_INGRESS_CLASS
241
+ found = subprocess.run(
242
+ ["kubectl", "get", "ingressclass", class_name, "-o", "name"],
243
+ capture_output=True,
244
+ text=True,
245
+ )
246
+ if found.returncode == 0 and found.stdout.strip():
247
+ return
248
+ if class_name != DEFAULT_INGRESS_CLASS:
249
+ msg.warn(
250
+ f"IngressClass '{class_name}' doesn't exist. Install its ingress "
251
+ "controller, or nothing will serve the cluster's domain."
252
+ )
253
+ return
254
+ cluster = overrides.cluster
255
+ port = None
256
+ tls = False
257
+ if cluster and cluster.fqdn:
258
+ domain = URL.parse(f"{cluster.scheme or 'https'}://{cluster.fqdn}")
259
+ port = domain.port
260
+ tls = domain.scheme == "https"
261
+ msg.info("No Traefik IngressClass found; installing Traefik")
262
+ ensure_traefik(port=port, tls=tls)
263
+
264
+
198
265
  def _ensure_cluster_keypair_standalone(
199
266
  secret_name: str, namespace: str, database_password: str = ""
200
267
  ) -> str:
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "prog": "ellf",
3
3
  "help": "Ellf Command Line Interface.",
4
- "version": "20.0.7",
4
+ "version": "21.0.1",
5
5
  "extra_key": "_extra",
6
6
  "commands": {
7
7
  "actions": {
@@ -289,9 +289,9 @@
289
289
  "id": "agent",
290
290
  "option": "--agent",
291
291
  "short": null,
292
- "orig_help": "Set up coding agents to work with Ellf: install the Ellf skills and the knowledge base MCP server. One of claude, codex, opencode, copilot; repeat the option or comma-separate them for several",
292
+ "orig_help": "Set up coding agents to work with Ellf: install the Ellf skills and the knowledge base MCP server. One of claude, codex, copilot, junie, opencode; repeat the option or comma-separate them for several",
293
293
  "default": null,
294
- "help": "Set up coding agents to work with Ellf: install the Ellf skills and the knowledge base MCP server. One of claude, codex, opencode, copilot; repeat the option or comma-separate them for several (str)",
294
+ "help": "Set up coding agents to work with Ellf: install the Ellf skills and the knowledge base MCP server. One of claude, codex, copilot, junie, opencode; repeat the option or comma-separate them for several (str)",
295
295
  "action": "append",
296
296
  "choices": null,
297
297
  "has_converter": false,
@@ -219,8 +219,8 @@ ellf secret create my-credentials OPENAI_API_KEY="sk-..." CUSTOM_SECRET=-
219
219
  login_org = "Name or ID of the organization to log into. If omitted: auto-select when only one is available, or prompt interactively"
220
220
  login_agent = (
221
221
  "Set up coding agents to work with Ellf: install the Ellf skills and the "
222
- "knowledge base MCP server. One of claude, codex, opencode, copilot; repeat "
223
- "the option or comma-separate them for several"
222
+ "knowledge base MCP server. One of claude, codex, copilot, junie, opencode; "
223
+ "repeat the option or comma-separate them for several"
224
224
  )
225
225
  claude = "Shortcut for --agent claude"
226
226
  use_active_venv = "Use the currently active virtualenv, instead of making a temporary one"
@@ -0,0 +1,3 @@
1
+ 20.0.7
2
+ major
3
+ 3e5dfba3-2810-47b4-85a9-938bfff72a04
@@ -0,0 +1,3 @@
1
+ 21.0.0
2
+ patch
3
+ 1058e453-613f-492b-a3c7-f3ca2abe8c2d
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 20.0.7
3
+ Version: 21.0.1
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
@@ -336,6 +336,8 @@ ellf_cli/version/20.0.3_2026-10-14-14-29-16_patch_070af1c4-f9d9-4f97-8112-058de9
336
336
  ellf_cli/version/20.0.4_2026-10-14-16-20-24_patch_c6672844-8227-4e0a-9fb5-36af7e7141dc
337
337
  ellf_cli/version/20.0.5_2026-10-15-08-53-28_patch_10154146-8afd-4632-b250-9b4b9f5bf67c
338
338
  ellf_cli/version/20.0.6_2026-10-15-14-17-40_patch_df3a5d3c-f0e0-46cb-aeaf-15b51c8a0f13
339
+ ellf_cli/version/20.0.7_2026-10-16-07-09-40_major_3e5dfba3-2810-47b4-85a9-938bfff72a04
340
+ ellf_cli/version/21.0.0_2026-10-16-10-44-29_patch_1058e453-613f-492b-a3c7-f3ca2abe8c2d
339
341
  ellf_cli/version/__init__.py
340
342
  ellf_cli/version/read_version.py
341
343
  tests/test_agents.py
@@ -354,6 +356,7 @@ tests/test_info.py
354
356
  tests/test_infra_config_io.py
355
357
  tests/test_infra_configure.py
356
358
  tests/test_infra_deploy_node_labels.py
359
+ tests/test_infra_deploy_preflight.py
357
360
  tests/test_infra_destroy.py
358
361
  tests/test_infra_get_terraform.py
359
362
  tests/test_infra_hibernate.py
@@ -19,14 +19,20 @@ SESSION_VARS = (
19
19
  @pytest.fixture(autouse=True)
20
20
  def home(tmp_path, monkeypatch) -> Path:
21
21
  monkeypatch.setattr(Path, "home", lambda: tmp_path)
22
- for var in (*SESSION_VARS, "CODEX_HOME", "COPILOT_HOME", "XDG_CONFIG_HOME"):
22
+ for var in (
23
+ *SESSION_VARS,
24
+ "CODEX_HOME",
25
+ "COPILOT_HOME",
26
+ "JUNIE_HOME",
27
+ "XDG_CONFIG_HOME",
28
+ ):
23
29
  monkeypatch.delenv(var, raising=False)
24
30
  return tmp_path
25
31
 
26
32
 
27
33
  def test_skills_dirs(home, monkeypatch):
28
34
  assert agents.skills_dirs("claude") == [home / ".claude" / "skills"]
29
- for agent in ("codex", "opencode", "copilot"):
35
+ for agent in ("codex", "opencode", "copilot", "junie"):
30
36
  assert agents.skills_dirs(agent) == [home / ".agents" / "skills"]
31
37
  monkeypatch.setenv("COPILOT_HOME", str(home / "cp"))
32
38
  assert agents.skills_dirs("copilot") == [
@@ -210,6 +216,24 @@ class TestCopilotConfig:
210
216
  assert "ellf-kb" in json.loads(target.read_text())["mcpServers"]
211
217
 
212
218
 
219
+ class TestJunieConfig:
220
+ def test_writes_stdio_server(self, home):
221
+ path = home / ".junie" / "mcp" / "mcp.json"
222
+ path.parent.mkdir(parents=True)
223
+ path.write_text(json.dumps({"mcpServers": {"other": {"url": "x"}}}))
224
+ assert agents.configure_mcp("junie", CMD) == [path]
225
+ servers = json.loads(path.read_text())["mcpServers"]
226
+ assert servers["other"] == {"url": "x"}
227
+ assert servers["ellf-kb"] == {
228
+ "command": "/venv/bin/ellf",
229
+ "args": ["mcp", "kb"],
230
+ }
231
+
232
+ def test_honours_junie_home(self, home, monkeypatch):
233
+ monkeypatch.setenv("JUNIE_HOME", str(home / "jn"))
234
+ assert agents.configure_mcp("junie", CMD) == [home / "jn" / "mcp" / "mcp.json"]
235
+
236
+
213
237
  class TestSessions:
214
238
  def test_no_session_outside_agents(self):
215
239
  assert agents.current_session() is None
@@ -0,0 +1,75 @@
1
+ """What `ellf infra deploy` checks and installs before the chart: no FILL-IN
2
+ placeholders left in values.yaml, and an ingress controller serving the
3
+ cluster's domain (Colima's k3s ships without Traefik)."""
4
+
5
+ from subprocess import CompletedProcess
6
+ from unittest.mock import patch
7
+
8
+ from ellf_cli.commands.infra._helpers import traefik_values
9
+ from ellf_cli.commands.infra.deploy import (
10
+ _ensure_ingress_controller,
11
+ _placeholder_keys,
12
+ )
13
+ from ellf_cli.helm import HelmChartOverrides
14
+
15
+
16
+ def test_placeholder_keys_are_found_at_any_depth():
17
+ values = {
18
+ "registries": {"upstream": "r", "user": "FILL-IN-from-terraform-output"},
19
+ "database": {"ip": "FILL-IN", "user": "cluster_user"},
20
+ "imagePullSecrets": [{"name": "FILL-IN"}],
21
+ "networkPolicy": True,
22
+ "storage": {"hostPath": ""},
23
+ }
24
+ assert _placeholder_keys(values) == [
25
+ "registries.user",
26
+ "database.ip",
27
+ "imagePullSecrets.0.name",
28
+ ]
29
+
30
+
31
+ def test_no_extra_entrypoint_on_standard_ports():
32
+ for port in (None, 80, 443):
33
+ assert set(traefik_values(port=port)["ports"]) == {"web", "websecure"}
34
+
35
+
36
+ def test_entrypoint_on_the_domain_port():
37
+ ellf = traefik_values(port=8443)["ports"]["ellf"]
38
+ assert ellf["port"] == ellf["exposedPort"] == 8443
39
+ assert ellf["tls"] == {"enabled": False}
40
+ assert traefik_values(port=8443, tls=True)["ports"]["ellf"]["tls"] == {
41
+ "enabled": True
42
+ }
43
+
44
+
45
+ def _overrides(fqdn: str, scheme: str) -> HelmChartOverrides:
46
+ return HelmChartOverrides.model_validate(
47
+ {"cluster": {"fqdn": fqdn, "scheme": scheme}}
48
+ )
49
+
50
+
51
+ def _kubectl(stdout: str):
52
+ def run(cmd, **kwargs):
53
+ assert cmd[:3] == ["kubectl", "get", "ingressclass"]
54
+ return CompletedProcess(cmd, 0 if stdout else 1, stdout=stdout, stderr="")
55
+
56
+ return run
57
+
58
+
59
+ def test_traefik_is_installed_when_the_cluster_has_none():
60
+ with (
61
+ patch("ellf_cli.commands.infra.deploy.subprocess.run", _kubectl("")),
62
+ patch("ellf_cli.commands.infra.deploy.ensure_traefik") as ensure,
63
+ ):
64
+ _ensure_ingress_controller(_overrides("localhost:8443", "http"))
65
+ ensure.assert_called_once_with(port=8443, tls=False)
66
+
67
+
68
+ def test_an_existing_ingress_class_is_left_alone():
69
+ found = _kubectl("ingressclass.networking.k8s.io/traefik")
70
+ with (
71
+ patch("ellf_cli.commands.infra.deploy.subprocess.run", found),
72
+ patch("ellf_cli.commands.infra.deploy.ensure_traefik") as ensure,
73
+ ):
74
+ _ensure_ingress_controller(_overrides("localhost:8443", "http"))
75
+ ensure.assert_not_called()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes