ellf-cli 17.0.45__tar.gz → 17.0.51__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-17.0.45/ellf_cli.egg-info → ellf_cli-17.0.51}/PKG-INFO +1 -1
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/about.json +1 -1
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/cluster_config.py +26 -4
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/_helpers.py +39 -17
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/provision.py +13 -3
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/start.py +15 -3
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/terraform.py +25 -9
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf.json +1 -1
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/helm.py +44 -8
- {ellf_cli-17.0.45 → ellf_cli-17.0.51/ellf_cli.egg-info}/PKG-INFO +1 -1
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/LICENSE +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/MANIFEST.in +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/README.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/__init__.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/__main__.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/about.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/appdirs.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/auth.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/cli.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/cloud/__init__.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/cloud/gcp.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/__init__.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/_cluster_select.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/_org_select.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/_recipe_file.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/_recipe_subcommand.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/_state.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/actions.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/agents.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/assets.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/auth.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/clusters.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/config.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/datasets.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/files/__init__.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/files/cp.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/files/ls.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/files/rm.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/files/rsync.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/files/stats.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/general.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/import_export.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/__init__.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/deploy.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/init_values.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/register.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/setup.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/tls.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/jobs.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/packages.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/paths.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/plans.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/projects.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/publish_code.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/publish_data.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/recipes.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/secrets.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/services.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/support.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/tasks.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/todos.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/users.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/config.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/.claude-plugin/plugin.json +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/.gitignore +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skill_variants.json +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/references/annotation_audit.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/references/builtin_ellf_annotation_recipes.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/annotation_audit.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/builtin_ellf_annotation_recipes.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/builtin_prodigy_recipes.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-ask/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-handoff/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/references/annotation_metrics.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/references/training_monitoring.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/references/annotation_metrics.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/references/training_monitoring.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/scripts/check_training.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-ops.assistant/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-ops.coding/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-ops.coding/references/data_infra_cli.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-ops.coding/scripts/run_job.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-patterns/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-patterns/references/pattern_strategies.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_action_recipe.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_agent_recipe.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_blocks_ui.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_correct.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_custom_ui.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_manual.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_pages_ui.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_routing.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_task_recipe.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_teach.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/builtin_recipes.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/ellf_recipe_sdk.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/lint_recipe.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/prodigy_recipe_api.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/template_index.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.assistant/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/consulting_patterns.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/explosion_strategy.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/prodigy_llm_bot.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.coding/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/consulting_patterns.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/explosion_strategy.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/prodigy_llm_bot.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-support.assistant/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-support.coding/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-todo/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.assistant/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/diagnostics.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/evaluation_guide.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/model_selection.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/training_paradigms.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/workflow.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/SKILL.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_advanced.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_architectures.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_training.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/diagnostics.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/evaluation_guide.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/experiment_patterns.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/model_selection.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/training_paradigms.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/training_troubleshooting.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/workflow.md +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/scripts/ellf_logger.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/errors.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/key_pair.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/main.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/messages.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/query.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/cookiecutter.json +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/.gitignore +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/README.md.tmpl +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements-dev.in +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements.in +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/setup.py.tmpl +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/__init__.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/about.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/__init__.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/example_task.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/testing/__init__.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ty.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ui.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/url.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/util.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli.egg-info/SOURCES.txt +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli.egg-info/dependency_links.txt +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli.egg-info/entry_points.txt +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli.egg-info/not-zip-safe +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli.egg-info/requires.txt +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli.egg-info/top_level.txt +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/pyproject.toml +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/setup.cfg +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/setup.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_appdirs.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_auth.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_config.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_errors.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_files_cp.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_files_cp_helpers.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_info.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_invalid_secrets.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_key_pair.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_login.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_logout.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_main.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_org_select.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_plans.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_projects.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_publish_data.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_query.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_recipe_file.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_recipes.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_state.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_support.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_ty.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_ui.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_ui_extras.py +0 -0
- {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_util.py +0 -0
|
@@ -5,7 +5,7 @@ import tempfile
|
|
|
5
5
|
from contextlib import contextmanager
|
|
6
6
|
from typing import Annotated, Iterator
|
|
7
7
|
|
|
8
|
-
from pydantic import BaseModel, Field
|
|
8
|
+
from pydantic import BaseModel, Field, model_validator
|
|
9
9
|
|
|
10
10
|
from .helm import (
|
|
11
11
|
HelmChartValues,
|
|
@@ -35,7 +35,8 @@ class ClusterConfig(BaseModel):
|
|
|
35
35
|
workspace: str | None = None
|
|
36
36
|
|
|
37
37
|
class Deployment(BaseModel):
|
|
38
|
-
gcp: HelmChartValues.GCP
|
|
38
|
+
gcp: HelmChartValues.GCP | None = None
|
|
39
|
+
aws: HelmChartValues.AWS | None = None
|
|
39
40
|
domain: str
|
|
40
41
|
pam_domain: Annotated[str, Field(alias="pamDomain")] = ""
|
|
41
42
|
container_registry: str = ""
|
|
@@ -53,9 +54,25 @@ class ClusterConfig(BaseModel):
|
|
|
53
54
|
system_node_pool_size: int = 1
|
|
54
55
|
model_config = {"populate_by_name": True}
|
|
55
56
|
|
|
57
|
+
@model_validator(mode="after")
|
|
58
|
+
def _check_exactly_one_cloud_provider(self) -> "ClusterConfig.Deployment":
|
|
59
|
+
if bool(self.gcp) == bool(self.aws):
|
|
60
|
+
raise ValueError(
|
|
61
|
+
"deployment must set exactly one of 'gcp' or 'aws', not"
|
|
62
|
+
f" {'both' if self.gcp else 'neither'}"
|
|
63
|
+
)
|
|
64
|
+
return self
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def cloud_provider(self) -> str:
|
|
68
|
+
return "gcp" if self.gcp else "aws"
|
|
69
|
+
|
|
56
70
|
@property
|
|
57
71
|
def region(self) -> str:
|
|
58
|
-
|
|
72
|
+
if self.gcp:
|
|
73
|
+
return self.gcp.zone[:-2]
|
|
74
|
+
assert self.aws
|
|
75
|
+
return self.aws.region
|
|
59
76
|
|
|
60
77
|
name: str
|
|
61
78
|
terraform: Terraform
|
|
@@ -84,6 +101,7 @@ class ClusterConfigOverrides(BaseModel):
|
|
|
84
101
|
|
|
85
102
|
class Deployment(BaseModel):
|
|
86
103
|
gcp: HelmChartValues.GCP | None = None
|
|
104
|
+
aws: HelmChartValues.AWS | None = None
|
|
87
105
|
domain: str | None = None
|
|
88
106
|
pam_domain: Annotated[str | None, Field(alias="pamDomain")] = None
|
|
89
107
|
container_registry: str | None = None
|
|
@@ -103,7 +121,11 @@ class ClusterConfigOverrides(BaseModel):
|
|
|
103
121
|
|
|
104
122
|
@property
|
|
105
123
|
def region(self) -> str | None:
|
|
106
|
-
|
|
124
|
+
if self.gcp:
|
|
125
|
+
return self.gcp.zone[:-2]
|
|
126
|
+
if self.aws:
|
|
127
|
+
return self.aws.region
|
|
128
|
+
return None
|
|
107
129
|
|
|
108
130
|
name: str | None = None
|
|
109
131
|
terraform: Terraform | None = None
|
|
@@ -26,23 +26,45 @@ SYSTEM_NODE_TOLERATIONS = [
|
|
|
26
26
|
]
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
def get_cluster_credentials(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
29
|
+
def get_cluster_credentials(
|
|
30
|
+
cloud_provider: str,
|
|
31
|
+
cluster_name: str,
|
|
32
|
+
*,
|
|
33
|
+
project: str = "",
|
|
34
|
+
zone: str = "",
|
|
35
|
+
region: str = "",
|
|
36
|
+
) -> None:
|
|
37
|
+
"""Configure kubectl for the cluster via the provider's own credential command."""
|
|
38
|
+
if cloud_provider == "aws":
|
|
39
|
+
subprocess.run(
|
|
40
|
+
[
|
|
41
|
+
"aws",
|
|
42
|
+
"eks",
|
|
43
|
+
"update-kubeconfig",
|
|
44
|
+
"--region",
|
|
45
|
+
region,
|
|
46
|
+
"--name",
|
|
47
|
+
cluster_name,
|
|
48
|
+
],
|
|
49
|
+
check=True,
|
|
50
|
+
text=True,
|
|
51
|
+
)
|
|
52
|
+
else:
|
|
53
|
+
subprocess.run(
|
|
54
|
+
[
|
|
55
|
+
"gcloud",
|
|
56
|
+
"container",
|
|
57
|
+
"clusters",
|
|
58
|
+
"get-credentials",
|
|
59
|
+
cluster_name,
|
|
60
|
+
"--zone",
|
|
61
|
+
zone,
|
|
62
|
+
"--project",
|
|
63
|
+
project,
|
|
64
|
+
],
|
|
65
|
+
check=True,
|
|
66
|
+
text=True,
|
|
67
|
+
)
|
|
46
68
|
|
|
47
69
|
|
|
48
70
|
def ensure_cluster_keypair(infra_secret_name: str, namespace: str = "ellf") -> str:
|
|
@@ -51,9 +51,19 @@ def provision(
|
|
|
51
51
|
cluster_name = config.deployment.cluster_name
|
|
52
52
|
assert cluster_name, "cluster_name must be set in deployment config"
|
|
53
53
|
auth = get_auth_state()
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
if config.deployment.cloud_provider == "aws":
|
|
55
|
+
assert config.deployment.aws
|
|
56
|
+
get_cluster_credentials(
|
|
57
|
+
"aws", cluster_name, region=config.deployment.aws.region
|
|
58
|
+
)
|
|
59
|
+
else:
|
|
60
|
+
assert config.deployment.gcp
|
|
61
|
+
get_cluster_credentials(
|
|
62
|
+
"gcp",
|
|
63
|
+
cluster_name,
|
|
64
|
+
project=config.deployment.gcp.project,
|
|
65
|
+
zone=config.deployment.gcp.zone,
|
|
66
|
+
)
|
|
57
67
|
ensure_cluster_keypair(config.deployment.infra_secret_name)
|
|
58
68
|
cluster_auth = get_cluster_auth(auth.client, config.deployment.domain)
|
|
59
69
|
values = build_values(config, cluster_auth)
|
|
@@ -56,9 +56,20 @@ def start(
|
|
|
56
56
|
config = ClusterConfig(**config_dict)
|
|
57
57
|
cluster_name = config.deployment.cluster_name
|
|
58
58
|
assert cluster_name, "cluster_name must be set in deployment config"
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
cloud_provider = config.deployment.cloud_provider
|
|
60
|
+
if cloud_provider == "aws":
|
|
61
|
+
assert config.deployment.aws
|
|
62
|
+
get_cluster_credentials(
|
|
63
|
+
"aws", cluster_name, region=config.deployment.aws.region
|
|
64
|
+
)
|
|
65
|
+
else:
|
|
66
|
+
assert config.deployment.gcp
|
|
67
|
+
get_cluster_credentials(
|
|
68
|
+
"gcp",
|
|
69
|
+
cluster_name,
|
|
70
|
+
project=config.deployment.gcp.project,
|
|
71
|
+
zone=config.deployment.gcp.zone,
|
|
72
|
+
)
|
|
62
73
|
public_key = ensure_cluster_keypair(config.deployment.infra_secret_name)
|
|
63
74
|
if offline is not None:
|
|
64
75
|
from ellf_pam_sdk.models import ClusterCredentials, Image, Secrets
|
|
@@ -86,6 +97,7 @@ def start(
|
|
|
86
97
|
auth.org_id,
|
|
87
98
|
config.deployment.domain,
|
|
88
99
|
public_key,
|
|
100
|
+
cloud_provider=cloud_provider,
|
|
89
101
|
)
|
|
90
102
|
cluster_auth = get_cluster_auth(auth.client, config.deployment.domain)
|
|
91
103
|
values = build_values(config, cluster_auth)
|
|
@@ -116,7 +116,7 @@ def apply_terraform(
|
|
|
116
116
|
if config_key is not None:
|
|
117
117
|
config_dict = config_dict[config_key]
|
|
118
118
|
config = ClusterConfig(**config_dict)
|
|
119
|
-
tf_dir = src /
|
|
119
|
+
tf_dir = src / config.deployment.cloud_provider
|
|
120
120
|
if yes_tf_init:
|
|
121
121
|
_terraform_init(config, tf_dir)
|
|
122
122
|
if yes_tf_init or yes_tf_apply:
|
|
@@ -185,15 +185,31 @@ def _terraform_init(config: ClusterConfig, path: Path) -> None:
|
|
|
185
185
|
@contextmanager
|
|
186
186
|
def _write_terraform_vars(config: ClusterConfig) -> Iterator[str]:
|
|
187
187
|
"""Write terraform variables to a temp file, yielding its path."""
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
"domain": config.deployment.domain,
|
|
192
|
-
"enable_ssh": True,
|
|
193
|
-
"system_node_pool_machine_type": config.deployment.system_node_pool_machine_type,
|
|
194
|
-
"system_node_pool_size": str(config.deployment.system_node_pool_size),
|
|
195
|
-
"worker_types": {w.name: w.to_terraform_var() for w in config.node_pools},
|
|
188
|
+
cloud_provider = config.deployment.cloud_provider
|
|
189
|
+
worker_types = {
|
|
190
|
+
w.name: w.to_terraform_var(cloud_provider) for w in config.node_pools
|
|
196
191
|
}
|
|
192
|
+
if cloud_provider == "aws":
|
|
193
|
+
assert config.deployment.aws
|
|
194
|
+
data = {
|
|
195
|
+
"aws_region": config.deployment.aws.region,
|
|
196
|
+
"domain": config.deployment.domain,
|
|
197
|
+
"enable_ssh": True,
|
|
198
|
+
"system_node_pool_instance_type": config.deployment.system_node_pool_machine_type,
|
|
199
|
+
"system_node_pool_size": str(config.deployment.system_node_pool_size),
|
|
200
|
+
"worker_types": worker_types,
|
|
201
|
+
}
|
|
202
|
+
else:
|
|
203
|
+
assert config.deployment.gcp
|
|
204
|
+
data = {
|
|
205
|
+
"gcp_project": config.deployment.gcp.project,
|
|
206
|
+
"gcp_zone": config.deployment.gcp.zone,
|
|
207
|
+
"domain": config.deployment.domain,
|
|
208
|
+
"enable_ssh": True,
|
|
209
|
+
"system_node_pool_machine_type": config.deployment.system_node_pool_machine_type,
|
|
210
|
+
"system_node_pool_size": str(config.deployment.system_node_pool_size),
|
|
211
|
+
"worker_types": worker_types,
|
|
212
|
+
}
|
|
197
213
|
with tempfile.NamedTemporaryFile(
|
|
198
214
|
mode="w", suffix=".tfvars.json", delete=True
|
|
199
215
|
) as tmp:
|
|
@@ -66,6 +66,9 @@ class NodePool(BaseModel):
|
|
|
66
66
|
preemptible: bool = False
|
|
67
67
|
spot: bool = False
|
|
68
68
|
|
|
69
|
+
class AWSConfig(BaseModel):
|
|
70
|
+
spot: bool = False
|
|
71
|
+
|
|
69
72
|
name: str
|
|
70
73
|
node_class: str
|
|
71
74
|
machine_type: str
|
|
@@ -74,6 +77,7 @@ class NodePool(BaseModel):
|
|
|
74
77
|
max_size: int | None = None
|
|
75
78
|
gpu: GPU | None = None
|
|
76
79
|
gcp: GCPConfig = Field(default_factory=GCPConfig)
|
|
80
|
+
aws: AWSConfig = Field(default_factory=AWSConfig)
|
|
77
81
|
per_job: PerJob
|
|
78
82
|
|
|
79
83
|
@property
|
|
@@ -92,18 +96,39 @@ class NodePool(BaseModel):
|
|
|
92
96
|
per_job=self.per_job,
|
|
93
97
|
)
|
|
94
98
|
|
|
95
|
-
def
|
|
96
|
-
|
|
99
|
+
def _min_max_size(self) -> tuple[int, int]:
|
|
100
|
+
min_size = self.min_size if self.min_size is not None else 0
|
|
101
|
+
max_size = (
|
|
102
|
+
self.max_size if self.max_size is not None else max(self.target_size, 1)
|
|
103
|
+
)
|
|
104
|
+
return min_size, max_size
|
|
105
|
+
|
|
106
|
+
def to_terraform_var(self, cloud_provider: str) -> dict:
|
|
107
|
+
"""Convert to a terraform worker_types variable entry.
|
|
108
|
+
|
|
109
|
+
The two workspaces' `worker_types` variable shapes differ (AWS has no
|
|
110
|
+
separate preemptible/spot distinction and calls the GPU key `gpu`
|
|
111
|
+
rather than `guest_accelerator`), so the emitted dict is provider-specific.
|
|
112
|
+
"""
|
|
113
|
+
min_size, max_size = self._min_max_size()
|
|
114
|
+
if cloud_provider == "aws":
|
|
115
|
+
return {
|
|
116
|
+
"name": self.name,
|
|
117
|
+
"node_class": self.node_class,
|
|
118
|
+
"instance_type": self.machine_type,
|
|
119
|
+
"spot": self.aws.spot,
|
|
120
|
+
"min_size": min_size,
|
|
121
|
+
"max_size": max_size,
|
|
122
|
+
"gpu": self.gpu.model_dump() if self.gpu else None,
|
|
123
|
+
}
|
|
97
124
|
return {
|
|
98
125
|
"name": self.name,
|
|
99
126
|
"node_class": self.node_class,
|
|
100
127
|
"machine_type": self.machine_type,
|
|
101
128
|
"preemptible": self.preemptible,
|
|
102
129
|
"spot": self.spot,
|
|
103
|
-
"min_size":
|
|
104
|
-
"max_size":
|
|
105
|
-
if self.max_size is not None
|
|
106
|
-
else max(self.target_size, 1),
|
|
130
|
+
"min_size": min_size,
|
|
131
|
+
"max_size": max_size,
|
|
107
132
|
"guest_accelerator": self.gpu.model_dump() if self.gpu else None,
|
|
108
133
|
}
|
|
109
134
|
|
|
@@ -204,6 +229,9 @@ class HelmChartValues(BaseModel):
|
|
|
204
229
|
project: str
|
|
205
230
|
zone: str
|
|
206
231
|
|
|
232
|
+
class AWS(BaseModel):
|
|
233
|
+
region: str
|
|
234
|
+
|
|
207
235
|
class ConfigFile(BaseModel):
|
|
208
236
|
cluster_config: Annotated[str, Field(alias="clusterConfig")]
|
|
209
237
|
cpl_config: Annotated[str, Field(alias="cplConfig")]
|
|
@@ -285,6 +313,7 @@ class HelmChartValues(BaseModel):
|
|
|
285
313
|
service: Service
|
|
286
314
|
postgresql: Postgresql
|
|
287
315
|
gcp: GCP | None = None
|
|
316
|
+
aws: AWS | None = None
|
|
288
317
|
automount_service_account_token: Annotated[
|
|
289
318
|
bool | None, Field(alias="automountServiceAccountToken")
|
|
290
319
|
]
|
|
@@ -412,6 +441,9 @@ class HelmChartOverrides(BaseModel):
|
|
|
412
441
|
project: str | None = None
|
|
413
442
|
zone: str | None = None
|
|
414
443
|
|
|
444
|
+
class AWS(BaseModel):
|
|
445
|
+
region: str | None = None
|
|
446
|
+
|
|
415
447
|
class ConfigFile(BaseModel):
|
|
416
448
|
cluster_config: Annotated[str | None, Field(alias="clusterConfig")] = None
|
|
417
449
|
cpl_config: Annotated[str | None, Field(alias="cplConfig")] = None
|
|
@@ -510,6 +542,7 @@ class HelmChartOverrides(BaseModel):
|
|
|
510
542
|
service: Service | None = None
|
|
511
543
|
postgresql: Postgresql | None = None
|
|
512
544
|
gcp: GCP | None = None
|
|
545
|
+
aws: AWS | None = None
|
|
513
546
|
automount_service_account_token: Annotated[
|
|
514
547
|
bool | None, Field(alias="automountServiceAccountToken")
|
|
515
548
|
] = None
|
|
@@ -651,14 +684,17 @@ def build_values(
|
|
|
651
684
|
infra_secret_name=config.deployment.infra_secret_name,
|
|
652
685
|
),
|
|
653
686
|
gcp=HelmChartOverrides.GCP(**config.deployment.gcp.model_dump())
|
|
654
|
-
if config.deployment.gcp.project
|
|
687
|
+
if config.deployment.gcp and config.deployment.gcp.project
|
|
688
|
+
else None,
|
|
689
|
+
aws=HelmChartOverrides.AWS(**config.deployment.aws.model_dump())
|
|
690
|
+
if config.deployment.aws
|
|
655
691
|
else None,
|
|
656
692
|
service_account=HelmChartOverrides.ServiceAccount(
|
|
657
693
|
annotations={
|
|
658
694
|
"iam.gke.io/gcp-service-account": f"cluster-gke-sa@{config.deployment.gcp.project}.iam.gserviceaccount.com",
|
|
659
695
|
},
|
|
660
696
|
)
|
|
661
|
-
if config.deployment.gcp.project
|
|
697
|
+
if config.deployment.gcp and config.deployment.gcp.project
|
|
662
698
|
else None,
|
|
663
699
|
ingress=HelmChartOverrides.Ingress(
|
|
664
700
|
tls=HelmChartOverrides.Ingress.TLS(
|
|
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-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-ops.assistant/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-ops.coding/scripts/run_job.py
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
|
|
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-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.assistant/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.coding/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-support.assistant/SKILL.md
RENAMED
|
File without changes
|
{ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-support.coding/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
{ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.assistant/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/SKILL.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
|
|
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
|