ellf-cli 21.0.0__tar.gz → 21.0.2__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.
- {ellf_cli-21.0.0/ellf_cli.egg-info → ellf_cli-21.0.2}/PKG-INFO +1 -1
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/README.md +1 -1
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/infra/_helpers.py +36 -14
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/infra/deploy.py +70 -3
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/infra/init.py +1 -1
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf.json +3 -3
- ellf_cli-21.0.2/ellf_cli/version/21.0.0_2026-10-16-10-44-29_patch_1058e453-613f-492b-a3c7-f3ca2abe8c2d +3 -0
- ellf_cli-21.0.2/ellf_cli/version/21.0.1_2026-10-16-16-06-10_patch_e20b4ad2-b87f-478e-b4f4-323c8bcc5ea9 +3 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2/ellf_cli.egg-info}/PKG-INFO +1 -1
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli.egg-info/SOURCES.txt +3 -0
- ellf_cli-21.0.2/tests/test_infra_deploy_preflight.py +75 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_infra_init.py +32 -6
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/LICENSE +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/MANIFEST.in +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/__init__.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/__main__.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/about.json +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/about.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/agents.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/appdirs.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/auth.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/cli.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/cloud/__init__.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/cloud/gcp.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/cluster_config.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/__init__.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/_cluster_select.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/_org_select.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/_project_scope.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/_recipe_file.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/_recipe_subcommand.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/_state.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/_usage.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/actions.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/agents.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/assets.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/auth.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/clusters.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/config.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/datasets.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/files/__init__.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/files/cp.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/files/ls.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/files/rm.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/files/rsync.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/files/stats.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/general.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/import_export.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/infra/__init__.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/infra/_config_io.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/infra/configure.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/infra/hibernate.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/infra/init_values.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/infra/pause.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/infra/provision.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/infra/register.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/infra/setup.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/infra/start.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/infra/terraform.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/infra/tls.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/jobs.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/mcp.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/packages.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/paths.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/plans.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/projects.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/publish_code.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/publish_data.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/recipes.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/secrets.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/services.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/sessions.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/support.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/tasks.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/todos.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/commands/users.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/config.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/.gitignore +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/render.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.assistant.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-annotate/references/annotation_audit.assistant.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-annotate/references/annotation_audit.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_ellf_annotation_recipes.assistant.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_ellf_annotation_recipes.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_prodigy_recipes.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-annotate/references/label_schemes.assistant.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-annotate/references/label_schemes.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-ask/SKILL.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-handoff/SKILL.assistant.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.assistant.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-monitor/references/annotation_metrics.assistant.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-monitor/references/annotation_metrics.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-monitor/references/training_monitoring.assistant.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-monitor/references/training_monitoring.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-monitor/scripts.coding/check_training.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-ops/SKILL.assistant.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-ops/SKILL.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-ops/references.coding/data_infra_cli.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-ops/scripts.coding/run_job.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-patterns/SKILL.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-patterns/references/pattern_strategies.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/SKILL.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_action_recipe.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_agent_recipe.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_blocks_ui.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_correct.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_custom_ui.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_manual.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_pages_ui.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_routing.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_service_recipe.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_task_recipe.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_teach.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/builtin_recipes.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/ellf_recipe_sdk.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/lint_recipe.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/prodigy_recipe_api.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/template_index.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-project/SKILL.assistant.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-project/SKILL.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-project/references/annotation_agents.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-project/references/consulting_patterns.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-project/references/explosion_strategy.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.assistant.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-support/SKILL.assistant.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-support/SKILL.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-todo/SKILL.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-train/SKILL.assistant.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-train/SKILL.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-train/references/config_advanced.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-train/references/config_architectures.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-train/references/config_training.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-train/references/diagnostics.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-train/references/evaluation_guide.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-train/references/experiment_patterns.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-train/references/model_selection.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-train/references/training_paradigms.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-train/references/training_troubleshooting.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-train/references/workflow.assistant.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-train/references/workflow.coding.md +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-train/scripts.coding/ellf_logger.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/errors.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/helm.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/interactivity.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/key_pair.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/main.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/mcp_proxy.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/messages.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/pypi_auth.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/query.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/recipes_cookiecutter/cookiecutter.json +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/.gitignore +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/README.md.tmpl +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements-dev.in +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements.in +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/setup.py.tmpl +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/__init__.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/about.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/__init__.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/example_task.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/testing/__init__.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ty.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ui.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/url.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/util.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.114_2026-08-19-08-36-57__1a4e37c1-471e-4a81-b4d5-1ffe7dec3a61 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.114_2026-08-19-09-25-21_patch_33ff1e26-0e5e-46d8-8052-ab1d032e8b6c +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.115_2026-08-19-09-27-13_patch_4ac728c3-0342-4a36-adbc-e28d2d99b1ba +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.116_2026-08-19-09-30-47_patch_c706fef6-6813-4183-b268-12e7b00d7d0b +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.117_2026-08-19-09-39-14_patch_c6b0495f-2f88-4aa8-9ebf-0a235b4c407e +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.118_2026-08-19-09-52-00_patch_b395655a-8d78-4344-9266-6901c20f6517 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.119_2026-08-19-10-22-38_patch_8f95c49d-aedc-41b8-816d-ccb95f048831 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.120_2026-08-19-10-26-58_patch_7fbf35e6-cc01-4b75-8c9a-f5d054bcaf93 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.121_2026-08-19-10-42-02_patch_31a81b02-a886-4dea-84e0-67cc6ca412d5 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.122_2026-08-19-11-16-49_patch_1c4d7307-48d4-493e-936d-80af799d644b +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.123_2026-08-19-11-47-32_patch_d3d78d04-9989-45b1-91b1-93b571d8814a +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.124_2026-08-20-08-03-17_patch_57f4c389-2d19-41ce-aca4-13b61c62f387 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.125_2026-08-20-08-25-05_patch_7f368148-0d1c-4525-bbdf-c6d257ad861a +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.126_2026-08-20-14-51-36_patch_a99abcc8-3371-4c63-a759-bb7ea5b32432 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.127_2026-08-21-05-48-58_patch_34b4ccee-7596-4f57-93e9-774973cca58e +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.128_2026-08-21-10-47-20_patch_693112b9-927c-4a8f-8553-b06eef86079d +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.129_2026-08-21-11-16-54_patch_7a981666-01d9-4d1b-9ba3-2129744e3bd5 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.130_2026-08-21-13-09-36_patch_b7ad1a76-ce70-4d70-9d1a-7c414eba5bb4 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.131_2026-08-21-14-31-10_patch_9128ef66-193e-4caf-8710-afd86128e638 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.132_2026-08-24-08-59-34_patch_c600fc14-86a5-460f-9c4e-f0177056f756 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.133_2026-08-24-10-28-29_patch_b6ce3e32-9d7b-48ac-981a-270c22c180dd +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.134_2026-08-24-11-00-51_patch_a4fc0484-4a64-46a2-94f8-aa805254c7b0 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.135_2026-08-24-12-12-41_patch_a870a56f-9a65-49eb-92da-f572b26667d8 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.136_2026-08-24-12-42-46_patch_9b399356-6482-4291-8da7-e748a99c4b53 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.137_2026-08-24-12-53-57_patch_f7979348-1910-40cd-a535-90299eca84ee +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.138_2026-08-24-14-36-30_patch_ed0f8750-f663-498b-85e7-0d3f2213fcfe +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.139_2026-08-25-08-37-26_patch_3ba87e19-902b-4f76-b64c-90e5c0ca1fc6 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.140_2026-08-25-09-52-45_patch_abc830f2-df15-4385-b797-cdaf72c10752 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.141_2026-08-25-11-37-20_patch_1d9ec01e-06f6-4c8e-b095-af17d5b62b00 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.142_2026-08-26-07-38-49_patch_3dd23e36-e7df-494c-986f-a412861a8d40 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.143_2026-08-26-09-32-32_patch_7b7ebd34-de27-4b73-98a7-3e1501e16cd5 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.144_2026-08-26-10-56-43_patch_166064f2-2208-4c9b-9e25-25dc4cd32084 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.145_2026-08-26-11-37-29_patch_b997f3ee-d7d3-4408-9f2f-c8b6d08bdb3b +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.146_2026-08-26-12-15-20_patch_afbbb893-25db-468c-81db-2663ca373068 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.147_2026-08-26-14-10-50_patch_fd753b1f-2fa1-4ddb-a9e7-de690da85254 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.148_2026-08-27-09-08-35_patch_23814c0b-7f77-489c-b4a8-ceadd18146e3 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.149_2026-08-27-09-40-17_patch_8879d72e-a3d8-4abc-a16a-d9dcf75f0fa1 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.150_2026-08-27-10-57-25_patch_afbe60ed-3e23-4d88-be3c-f800d7002a7d +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.151_2026-08-28-09-02-46_patch_1d4ca23b-aeae-4ea8-96b1-8cf57371f29d +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.152_2026-08-28-15-37-24_patch_c9d0bdc1-a7e1-432b-92b9-92dc76fe0c78 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.153_2026-08-29-09-03-27_patch_7531573a-1b33-4092-aa9c-0e65f47b201f +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.154_2026-08-29-11-56-35_patch_919f5787-39c8-4dc1-ae6a-f27c28380f21 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.155_2026-08-29-15-15-59_patch_822f9ed8-c366-4e5f-9791-dee8467cf3ce +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.156_2026-08-29-16-19-01_patch_3ac2bf36-20f7-4c9f-9fdb-295d4466d59e +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.157_2026-08-30-17-32-17_patch_4302354c-c9c5-4be7-acd3-542872a748d8 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.158_2026-08-31-09-28-33_patch_3523774f-c25d-4102-8c1a-92fff046a48d +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.159_2026-08-31-10-31-01_patch_fe3e6290-2553-4154-a0a0-8b8a418280ed +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.160_2026-08-31-11-23-39_patch_e701a085-3d23-4212-b0af-73b1d419a4c1 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.161_2026-08-31-12-41-01_patch_074d7bde-c493-44db-bc15-e81fd91e2921 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.162_2026-08-31-13-58-06_patch_84db1d60-4280-433b-bd3a-22e5611cd315 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.163_2026-08-31-15-25-54_patch_1931c5ba-73df-48cb-8dcb-555ace0af267 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.163_2026-08-31-15-44-37_patch_3962e805-2a92-494a-a87b-b6e6d66c40a0 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.165_2026-08-31-19-48-59_patch_86e5b923-2b99-4b86-b542-469b197614be +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.166_2026-09-01-07-39-57_patch_c344892f-d542-4e7b-8f27-02365a411e15 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.167_2026-09-01-08-21-53_patch_e199d419-282a-4dbb-8756-cf98b7037e2b +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.168_2026-09-01-09-12-31_patch_235c9fe0-da15-431d-bb56-01e2b9b15f4b +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.169_2026-09-01-11-54-19_patch_98b617ab-d130-42b5-93f2-19cae56d4c4c +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.170_2026-09-02-09-27-28_patch_e448d2e6-b7ec-4235-96bf-0173b3623c87 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.171_2026-09-02-12-52-44_patch_e6a241c2-1d62-482c-a9eb-9e3373395c50 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.172_2026-09-04-08-47-04_patch_daae079f-c104-4fcd-bb57-7bff68e80ad9 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.173_2026-09-04-12-34-42_patch_399c4cbd-0c28-4dfd-a4ec-e569420a36e4 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.174_2026-09-04-13-08-48_patch_f5cfe3d5-808e-45e4-bafc-00d0554838ee +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.175_2026-09-04-17-20-46_patch_1ef542fa-5d8e-4d90-aa15-9fc4cea3dfec +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.176_2026-09-05-08-25-05_patch_ced5521f-f9da-4640-a921-95fcb5cd2e6d +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.177_2026-09-05-09-00-16_patch_803c1ad4-a9af-4953-92c5-d882dec03ea2 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.178_2026-09-05-09-30-34_patch_012f6259-2e3f-4591-9806-1920fd06cb1f +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.179_2026-09-05-09-33-43_patch_f4bdf28c-d584-47a5-b699-8c883330162c +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.180_2026-09-05-12-02-21_patch_34a14b01-d22d-44a8-ac63-be0370a61422 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.181_2026-09-05-12-47-46_patch_56b18867-99f6-4d5c-8215-7b9d60d34010 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.182_2026-09-05-13-35-18_patch_61b7d4d1-73c8-4603-9b0c-593e7405587f +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.183_2026-09-06-07-27-09_patch_d76331b2-e3a3-4c0b-8412-ecd131b6ac02 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.184_2026-09-06-10-21-47_patch_7680b7a1-49f0-4eef-b12e-4c854407448c +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.185_2026-09-06-10-30-40_patch_e56c2183-77f8-44ef-a92e-7377ea6ce8c1 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.186_2026-09-07-10-00-51_patch_67de5683-d208-4bc0-8fb6-7677377908e7 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.187_2026-09-07-10-18-13_patch_2086cee2-276b-48f7-80ce-6a17397b9541 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.188_2026-09-07-12-51-28_patch_d6590822-068f-4a19-814d-34bbf204ba6e +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.189_2026-09-07-12-55-23_patch_7e0fb04b-4d40-4490-974f-c74ba2ae55a1 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.190_2026-09-08-08-58-03_patch_15e3ac1e-4475-4272-bdd8-d00bb0db8f17 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.191_2026-09-08-09-55-58_patch_3d350e50-ee53-4282-bc75-d2251142c46e +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.192_2026-09-08-11-12-21_patch_0733223b-1ae2-4b5b-897f-dfc57574ff83 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.193_2026-09-08-21-48-17_patch_8d07d4e6-3555-4720-85c9-9452570fae2d +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.194_2026-09-09-07-53-43_patch_69559429-aa42-4b62-9bd7-cdfded1c00d0 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.195_2026-09-09-09-55-40_patch_bbf67f1d-3b9a-43a2-b1bc-22df3fed8a34 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.196_2026-09-09-09-59-47_patch_70d76812-7b3c-4192-ad49-fcaccc29b0da +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.197_2026-09-09-13-06-06_patch_d455be0b-5421-492a-b952-fab0fd8110f8 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.198_2026-09-09-13-14-34_patch_267f54e5-311e-435e-882f-8e19191325ea +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.199_2026-09-09-22-24-18_patch_81e3e453-ca0e-42fa-9c21-8f94d43c05f2 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.200_2026-09-10-07-19-50_patch_911714fa-1fa3-4165-bfe6-d10c650bf5bf +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.201_2026-09-10-10-14-19_patch_864015f2-b0b0-4563-a1c8-155629cb9126 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.202_2026-09-10-11-00-05_patch_18270ecf-e770-4e69-8bcf-e5143c39929b +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.203_2026-09-10-11-10-41_patch_ff273ab1-44f3-4bc0-b184-3396e943df04 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.204_2026-09-10-13-02-02_patch_d4ee41e2-d13c-4941-8605-3f1a42b56b22 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.205_2026-09-10-13-57-50_patch_284df67e-5957-4b0c-bc64-5581db6ddecc +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.206_2026-09-11-10-18-50_patch_1ac7e410-0e62-4eef-bbe4-ebf93c9d0869 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/17.0.207_2026-09-11-15-26-02_major_3f1b3ed7-eaac-41f5-b740-0af3331595d9 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.0_2026-09-12-10-01-10_patch_8995783a-a9fa-4c4e-90b3-6386a4c481eb +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.10_2026-09-14-16-09-38_patch_9403d562-eed0-4125-a8b3-09cd92a13298 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.11_2026-09-15-09-05-57_patch_8b22dba2-d931-4c4d-ae60-db3238d5e73d +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.12_2026-09-15-11-18-52_patch_81314afa-e70d-4ad8-b45b-3f8d62b983e7 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.13_2026-09-16-08-00-55_patch_bfa30fc0-3281-4de6-bb56-d7290c98d1c3 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.14_2026-09-16-14-38-26_patch_aae6e9b0-88f4-4bcf-b611-3308c7fcd6eb +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.15_2026-09-17-07-58-54_patch_43d40582-effd-4925-a8bd-e70fecf1faab +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.16_2026-09-17-08-12-37_patch_b4db2d23-88f1-45c1-82d9-78d38014fcb6 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.17_2026-09-18-09-38-19_patch_25697fc3-e9a8-4980-962b-e6cb0a4760c5 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.18_2026-09-18-09-54-33_patch_d37d9c71-c469-4d94-90d7-4898915ee991 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.19_2026-09-18-10-47-33_patch_47607b3c-d1b6-4864-b9b0-00a2a8d2ac32 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.1_2026-09-12-17-33-30_patch_f6ea2c99-a715-4c4d-876a-23ed8c62a83d +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.20_2026-09-18-11-07-21_patch_5a336f91-63a6-4877-97ed-da89395cc8f5 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.21_2026-09-18-13-34-52_patch_c56462e1-63d9-498f-a912-c80c5f0171d1 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.22_2026-09-20-08-10-45_patch_6afa2c20-bcef-4b7d-8685-2c9815d8683f +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.23_2026-09-20-08-38-35_patch_a7f169e5-37ab-4ec0-bf89-d14770181303 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.24_2026-09-20-15-49-27_patch_c1222081-ff44-4f20-aea2-5840b6d76efd +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.25_2026-09-21-06-11-40_patch_6df46dd9-e7d3-4e71-bec4-e5c93b4ac863 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.26_2026-09-21-07-54-11_patch_cc52dd36-5eba-4094-a1b0-d6f79f103441 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.27_2026-09-21-08-36-49_patch_a25fa125-9bcd-4317-8da5-851c1c329631 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.28_2026-09-21-09-44-01_patch_4430a721-0b3c-4f6a-b9bc-a53e667161bb +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.29_2026-09-21-10-58-07_patch_83b2b942-60a4-4bef-afd1-99690ba52b69 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.2_2026-09-13-06-36-33_patch_176bb944-1c49-4dd3-a001-8fce908825a0 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.30_2026-09-21-12-51-16_patch_519b9a65-d400-4234-b113-36b46e315507 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.31_2026-09-22-06-53-35_patch_5c45a235-81b6-4d05-801a-07dc7db61400 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.32_2026-09-22-07-42-04_patch_f12c6415-8166-4063-9e5d-26601b929d63 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.33_2026-09-22-08-12-32_patch_cec31bb0-a6cb-43e6-8407-25aba322b54c +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.34_2026-09-23-07-09-16_patch_659fccbb-c0a0-4f6f-bc87-e6abaa8815a7 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.35_2026-09-23-09-38-52_patch_023f904d-807a-4833-8a40-570365e8ec06 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.36_2026-09-23-10-05-33_patch_846fb491-2b1b-47ed-ac1f-ba40e744e199 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.37_2026-09-23-13-08-30_patch_8e4b1d24-156e-4ffe-8e4a-b8740ec18588 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.38_2026-09-24-06-41-37_patch_67adb1d6-3f49-4357-a67f-b1d48f23a972 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.39_2026-09-24-15-24-32_patch_e5dd375d-5643-4514-9b65-8d877c4a2bb2 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.3_2026-09-13-12-32-46_patch_58e5ce3a-f2a7-4789-b2cd-5cc75c72b6ec +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.40_2026-09-24-19-58-14_patch_ff18824b-be51-4a3d-a621-e96279e53c3e +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.41_2026-09-26-09-24-52_patch_b9979267-30f9-440a-a4ce-c611991d4886 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.42_2026-09-28-12-39-34_patch_dda535d9-8922-4eb9-ab51-6ecff0650c10 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.43_2026-09-28-13-35-27_minor_aca1168a-1286-4326-9d0c-2f2587c9fe92 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.4_2026-09-13-12-45-14_patch_b6c79d55-8f85-4f47-a304-df52b122c38c +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.5_2026-09-13-14-11-18_patch_9b111116-5e62-472a-b72c-d1bbafa22c97 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.5_2026-09-13-17-01-11_patch_d4bf61c0-83ac-4dd3-b512-a65805d298c8 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.6_2026-09-14-11-31-04_patch_fd2ebda6-22cb-4e7d-9452-2f6f2640e828 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.7_2026-09-13-17-06-08_patch_428af161-0b27-43c2-8751-e5f7874df120 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.0.9_2026-09-14-12-37-42_patch_b2ca0529-4b67-4fa4-8fdc-5f5e9f5d5166 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.1.0_2026-09-28-14-27-54_patch_324444f7-d24e-4189-b21f-1188894a3109 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/18.1.1_2026-09-28-21-03-07_major_e266a14a-7d96-4ece-92a3-8f34e64438a5 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.0_2026-09-29-11-05-31_patch_77d6f9f8-ead3-4d79-a4b2-b084b2dffc98 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.10_2026-10-02-12-56-52_patch_14e97576-73ca-44b8-82c9-7dad6f1789ab +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.11_2026-10-04-10-31-19_patch_088eb371-1799-4949-a119-286cf1cd55d1 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.12_2026-10-06-18-00-25_patch_36554bed-49c5-41cb-9fd4-48cc6af74c09 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.13_2026-10-07-12-24-08_patch_a540a364-3a0d-4960-b278-06ba2c7cc258 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.14_2026-10-07-12-52-39_patch_e3a6fc5c-2ee4-414c-a2dd-4910a655a7dd +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.15_2026-10-09-04-15-56_patch_bd7a9b06-867b-4fea-9678-973a05e3022d +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.16_2026-10-09-16-11-56_patch_a1135435-7dea-4f00-8c98-203ba3974382 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.17_2026-10-09-17-44-55_patch_faeacad8-541a-40f2-ab9c-abcd66fcd00e +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.18_2026-10-10-07-29-38_major_02601a1e-9bdb-45bf-ad67-a07b7dcd0002 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.1_2026-09-29-11-59-38_patch_bbf4753c-d641-4c2f-ac7c-02be6bd8e7c2 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.2_2026-09-29-12-44-07_patch_19fdaa94-60dc-464b-93b8-c17607ebc7b6 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.3_2026-09-29-14-16-00_patch_3cb60272-95cf-4311-8897-721e1b5c2c88 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.4_2026-09-29-16-24-53_patch_9fe8ad2b-e3ec-4558-a5fc-9c44c5c266dc +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.5_2026-09-29-17-13-16_patch_e48d2dd2-f41a-402e-a441-756b23c01dcb +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.6_2026-09-29-17-22-11_patch_3b1c79e9-9002-4e96-ba78-10668c33be6a +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.7_2026-09-30-07-50-58_patch_e8b1f046-d819-499c-9cd5-3e1a20fc9acf +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.8_2026-10-01-13-41-44_patch_7d63af18-e0af-4127-ab58-aede2407490f +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/19.0.9_2026-10-01-15-57-35_patch_143863cb-8f63-4ef7-bd78-c1114fc93a2d +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/20.0.0_2026-10-10-09-36-17_patch_d2618f39-cdc9-4d3a-ba40-1a0ad6265f3b +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/20.0.1_2026-10-11-10-24-33_patch_e29a8713-eecb-4eb1-9641-789d3cfab21a +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/20.0.2_2026-10-12-07-22-24_patch_f4053ad1-8fcd-4591-a68d-bf1e23485ba7 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/20.0.3_2026-10-14-14-29-16_patch_070af1c4-f9d9-4f97-8112-058de90d3ea8 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/20.0.4_2026-10-14-16-20-24_patch_c6672844-8227-4e0a-9fb5-36af7e7141dc +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/20.0.5_2026-10-15-08-53-28_patch_10154146-8afd-4632-b250-9b4b9f5bf67c +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/20.0.6_2026-10-15-14-17-40_patch_df3a5d3c-f0e0-46cb-aeaf-15b51c8a0f13 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/20.0.7_2026-10-16-07-09-40_major_3e5dfba3-2810-47b4-85a9-938bfff72a04 +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/__init__.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/version/read_version.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli.egg-info/dependency_links.txt +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli.egg-info/entry_points.txt +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli.egg-info/not-zip-safe +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli.egg-info/requires.txt +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli.egg-info/top_level.txt +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/pyproject.toml +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/setup.cfg +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/setup.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_agents.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_agents_info_stats.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_appdirs.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_auth.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_clusters_info_stats.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_config.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_datasets_export.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_errors.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_files_cp.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_files_cp_helpers.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_helm.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_import_export.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_info.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_infra_config_io.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_infra_configure.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_infra_deploy_node_labels.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_infra_destroy.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_infra_get_terraform.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_infra_hibernate.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_infra_pause.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_infra_provision.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_infra_start_fixes.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_infra_start_validation.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_infra_state_bucket.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_infra_terraform_init.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_invalid_secrets.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_job_list_project_filter.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_jobs_info_hides_creator.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_jobs_list_unmatched.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_key_pair.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_login.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_logout.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_main.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_mcp_proxy.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_org_select.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_plans.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_projects.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_projects_delete_confirm.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_publish_build_poll.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_publish_data.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_publish_import_root.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_publish_requirements.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_publish_versions.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_pypi_auth.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_query.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_recipe_file.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_recipe_required_args.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_recipes.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_sessions.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_state.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_support.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_todos.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_ty.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_ui.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_ui_extras.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_usage_counts.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_users_assign.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_users_info_stats.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_users_list.py +0 -0
- {ellf_cli-21.0.0 → ellf_cli-21.0.2}/tests/test_util.py +0 -0
|
@@ -375,7 +375,7 @@ Get detailed info for a cluster
|
|
|
375
375
|
| Argument | Type | Description | Default |
|
|
376
376
|
| --- | --- | --- | --- |
|
|
377
377
|
| `name_or_id` | `Union[str, UUID]` | Name or ID of the cluster | |
|
|
378
|
-
| `--select` | `list[str]` | Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'address', 'state', 'cloud', 'managed_subdomain', 'gcp_project', 'is_hosted'] | `None` |
|
|
378
|
+
| `--select` | `list[str]` | Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'address', 'state', 'cloud_provider', 'cloud', 'managed_subdomain', 'gcp_project', 'is_hosted'] | `None` |
|
|
379
379
|
| `--json` | `bool` | Output the result as JSON | `False` |
|
|
380
380
|
|
|
381
381
|
#### `ellf clusters update`
|
|
@@ -214,7 +214,41 @@ def k3s_traefik_exists() -> bool:
|
|
|
214
214
|
return result.returncode == 0
|
|
215
215
|
|
|
216
216
|
|
|
217
|
-
def
|
|
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
|
|
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 .
|
|
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.
|
|
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
|
-
#
|
|
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:
|
|
@@ -285,7 +285,7 @@ def _ensure_cluster(
|
|
|
285
285
|
except ClusterNotFound:
|
|
286
286
|
detail = None
|
|
287
287
|
if detail is not None:
|
|
288
|
-
if detail.cloud_provider != cloud_provider:
|
|
288
|
+
if detail.cloud_provider and detail.cloud_provider != cloud_provider:
|
|
289
289
|
msg.warn(
|
|
290
290
|
f"Registered cluster '{detail.name}' has cloud provider "
|
|
291
291
|
f"'{detail.cloud_provider}', not '{cloud_provider}' — "
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"prog": "ellf",
|
|
3
3
|
"help": "Ellf Command Line Interface.",
|
|
4
|
-
"version": "21.0.
|
|
4
|
+
"version": "21.0.2",
|
|
5
5
|
"extra_key": "_extra",
|
|
6
6
|
"commands": {
|
|
7
7
|
"actions": {
|
|
@@ -2104,9 +2104,9 @@
|
|
|
2104
2104
|
"id": "select",
|
|
2105
2105
|
"option": "--select",
|
|
2106
2106
|
"short": null,
|
|
2107
|
-
"orig_help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'address', 'state', 'cloud', 'managed_subdomain', 'gcp_project', 'is_hosted']",
|
|
2107
|
+
"orig_help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'address', 'state', 'cloud_provider', 'cloud', 'managed_subdomain', 'gcp_project', 'is_hosted']",
|
|
2108
2108
|
"default": null,
|
|
2109
|
-
"help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'address', 'state', 'cloud', 'managed_subdomain', 'gcp_project', 'is_hosted'] (list[str])",
|
|
2109
|
+
"help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'address', 'state', 'cloud_provider', 'cloud', 'managed_subdomain', 'gcp_project', 'is_hosted'] (list[str])",
|
|
2110
2110
|
"action": null,
|
|
2111
2111
|
"choices": null,
|
|
2112
2112
|
"has_converter": true,
|
|
@@ -337,6 +337,8 @@ ellf_cli/version/20.0.4_2026-10-14-16-20-24_patch_c6672844-8227-4e0a-9fb5-36af7e
|
|
|
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
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
|
|
341
|
+
ellf_cli/version/21.0.1_2026-10-16-16-06-10_patch_e20b4ad2-b87f-478e-b4f4-323c8bcc5ea9
|
|
340
342
|
ellf_cli/version/__init__.py
|
|
341
343
|
ellf_cli/version/read_version.py
|
|
342
344
|
tests/test_agents.py
|
|
@@ -355,6 +357,7 @@ tests/test_info.py
|
|
|
355
357
|
tests/test_infra_config_io.py
|
|
356
358
|
tests/test_infra_configure.py
|
|
357
359
|
tests/test_infra_deploy_node_labels.py
|
|
360
|
+
tests/test_infra_deploy_preflight.py
|
|
358
361
|
tests/test_infra_destroy.py
|
|
359
362
|
tests/test_infra_get_terraform.py
|
|
360
363
|
tests/test_infra_hibernate.py
|
|
@@ -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()
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Tests for `ellf infra init` — register + fetch + config generation."""
|
|
2
2
|
|
|
3
|
+
from datetime import datetime, timezone
|
|
3
4
|
from unittest.mock import MagicMock, patch
|
|
4
5
|
from uuid import uuid4
|
|
5
6
|
|
|
@@ -10,15 +11,22 @@ from ellf_cli.cluster_config import ClusterConfig
|
|
|
10
11
|
from ellf_cli.commands.infra.init import init
|
|
11
12
|
from ellf_cli.commands.infra.register import Registration
|
|
12
13
|
from ellf_cli.errors import CLIError
|
|
14
|
+
from ellf_pam_sdk.models import ClusterDetail
|
|
13
15
|
|
|
14
16
|
|
|
15
17
|
def _detail(name="my-cluster", address="acme.zone.dev", cloud_provider="gcp"):
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
now = datetime.now(timezone.utc)
|
|
19
|
+
return ClusterDetail(
|
|
20
|
+
id=uuid4(),
|
|
21
|
+
created=now,
|
|
22
|
+
updated=now,
|
|
23
|
+
org_id=uuid4(),
|
|
24
|
+
name=name,
|
|
25
|
+
address=address,
|
|
26
|
+
state="creating",
|
|
27
|
+
cloud={},
|
|
28
|
+
cloud_provider=cloud_provider,
|
|
29
|
+
)
|
|
22
30
|
|
|
23
31
|
|
|
24
32
|
def _registration(dest, address="acme.zone.dev", created=True) -> Registration:
|
|
@@ -94,6 +102,24 @@ def test_adopts_registered_cluster_and_generates_valid_config(tmp_path):
|
|
|
94
102
|
assert config.node_pools and config.node_pools[0].name == "core"
|
|
95
103
|
|
|
96
104
|
|
|
105
|
+
@pytest.mark.parametrize(
|
|
106
|
+
"registered_provider,warns", [("aws", True), ("gcp", False), (None, False)]
|
|
107
|
+
)
|
|
108
|
+
def test_warns_only_on_known_provider_mismatch(tmp_path, registered_provider, warns):
|
|
109
|
+
with patch("ellf_cli.commands.infra.init.msg.warn") as warn:
|
|
110
|
+
_run_init(
|
|
111
|
+
tmp_path,
|
|
112
|
+
settings_cluster_id=uuid4(),
|
|
113
|
+
detail=_detail(cloud_provider=registered_provider),
|
|
114
|
+
cloud_provider="gcp",
|
|
115
|
+
gcp_project="my-proj",
|
|
116
|
+
)
|
|
117
|
+
provider_warnings = [
|
|
118
|
+
c for c in warn.call_args_list if "has cloud provider" in c.args[0]
|
|
119
|
+
]
|
|
120
|
+
assert bool(provider_warnings) is warns
|
|
121
|
+
|
|
122
|
+
|
|
97
123
|
def test_new_gcp_cluster_uses_csi_filestore(tmp_path):
|
|
98
124
|
_run_init(
|
|
99
125
|
tmp_path,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.assistant.md
RENAMED
|
File without changes
|
{ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.coding.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-handoff/SKILL.assistant.md
RENAMED
|
File without changes
|
{ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.assistant.md
RENAMED
|
File without changes
|
{ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.coding.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ellf_cli-21.0.0 → ellf_cli-21.0.2}/ellf_cli/ellf_skills/skills/ellf-ops/scripts.coding/run_job.py
RENAMED
|
File without changes
|