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