ellf-cli 7.0.0__tar.gz → 10.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. {ellf_cli-7.0.0/ellf_cli.egg-info → ellf_cli-10.0.1}/PKG-INFO +1 -1
  2. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/about.json +1 -1
  3. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/general.py +13 -4
  4. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf.json +33 -34
  5. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/SKILL.md +8 -0
  6. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/SKILL.md +8 -0
  7. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-ops.coding/SKILL.md +8 -0
  8. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/SKILL.md +15 -3
  9. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-project.coding/SKILL.md +12 -1
  10. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-support.coding/SKILL.md +10 -2
  11. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.coding/SKILL.md +12 -1
  12. {ellf_cli-7.0.0 → ellf_cli-10.0.1/ellf_cli.egg-info}/PKG-INFO +1 -1
  13. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_login.py +58 -0
  14. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/LICENSE +0 -0
  15. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/MANIFEST.in +0 -0
  16. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/README.md +0 -0
  17. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/__init__.py +0 -0
  18. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/__main__.py +0 -0
  19. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/about.py +0 -0
  20. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/appdirs.py +0 -0
  21. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/auth.py +0 -0
  22. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/cli.py +0 -0
  23. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/cloud/__init__.py +0 -0
  24. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/cloud/gcp.py +0 -0
  25. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/cluster_config.py +0 -0
  26. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/__init__.py +0 -0
  27. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/_cluster_select.py +0 -0
  28. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/_org_select.py +0 -0
  29. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/_recipe_file.py +0 -0
  30. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/_recipe_subcommand.py +0 -0
  31. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/_state.py +0 -0
  32. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/actions.py +0 -0
  33. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/agents.py +0 -0
  34. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/assets.py +0 -0
  35. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/auth.py +0 -0
  36. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/clusters.py +0 -0
  37. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/config.py +0 -0
  38. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/datasets.py +0 -0
  39. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/files/__init__.py +0 -0
  40. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/files/cp.py +0 -0
  41. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/files/ls.py +0 -0
  42. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/files/rm.py +0 -0
  43. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/files/rsync.py +0 -0
  44. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/files/stats.py +0 -0
  45. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/import_export.py +0 -0
  46. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/infra/__init__.py +0 -0
  47. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/infra/_helpers.py +0 -0
  48. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/infra/deploy.py +0 -0
  49. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/infra/init_values.py +0 -0
  50. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/infra/provision.py +0 -0
  51. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/infra/register.py +0 -0
  52. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/infra/setup.py +0 -0
  53. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/infra/start.py +0 -0
  54. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/infra/terraform.py +0 -0
  55. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/infra/tls.py +0 -0
  56. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/jobs.py +0 -0
  57. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/packages.py +0 -0
  58. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/paths.py +0 -0
  59. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/plans.py +0 -0
  60. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/projects.py +0 -0
  61. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/publish_code.py +0 -0
  62. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/publish_data.py +0 -0
  63. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/recipes.py +0 -0
  64. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/secrets.py +0 -0
  65. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/services.py +0 -0
  66. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/support.py +0 -0
  67. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/tasks.py +0 -0
  68. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/commands/todos.py +0 -0
  69. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/config.py +0 -0
  70. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/.claude-plugin/plugin.json +0 -0
  71. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/.gitignore +0 -0
  72. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skill_variants.json +0 -0
  73. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/SKILL.md +0 -0
  74. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/references/annotation_audit.md +0 -0
  75. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/references/builtin_ellf_annotation_recipes.md +0 -0
  76. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/annotation_audit.md +0 -0
  77. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/builtin_ellf_annotation_recipes.md +0 -0
  78. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/builtin_prodigy_recipes.md +0 -0
  79. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-ask/SKILL.md +0 -0
  80. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-handoff/SKILL.md +0 -0
  81. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/SKILL.md +0 -0
  82. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/references/annotation_metrics.md +0 -0
  83. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/references/training_monitoring.md +0 -0
  84. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/references/annotation_metrics.md +0 -0
  85. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/references/training_monitoring.md +0 -0
  86. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/scripts/check_training.py +0 -0
  87. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-ops.assistant/SKILL.md +0 -0
  88. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-ops.coding/references/data_infra_cli.md +0 -0
  89. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-ops.coding/scripts/run_job.py +0 -0
  90. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-patterns/SKILL.md +0 -0
  91. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-patterns/references/pattern_strategies.md +0 -0
  92. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_action_recipe.py +0 -0
  93. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_agent_recipe.py +0 -0
  94. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_blocks_ui.py +0 -0
  95. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_correct.py +0 -0
  96. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_custom_ui.py +0 -0
  97. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_manual.py +0 -0
  98. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_pages_ui.py +0 -0
  99. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_routing.py +0 -0
  100. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_task_recipe.py +0 -0
  101. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_teach.py +0 -0
  102. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/builtin_recipes.md +0 -0
  103. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/ellf_recipe_sdk.md +0 -0
  104. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/lint_recipe.py +0 -0
  105. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/prodigy_recipe_api.md +0 -0
  106. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/template_index.md +0 -0
  107. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-project.assistant/SKILL.md +0 -0
  108. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/consulting_patterns.md +0 -0
  109. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/explosion_strategy.md +0 -0
  110. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/prodigy_llm_bot.md +0 -0
  111. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/consulting_patterns.md +0 -0
  112. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/explosion_strategy.md +0 -0
  113. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/prodigy_llm_bot.md +0 -0
  114. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-support.assistant/SKILL.md +0 -0
  115. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-todo/SKILL.md +0 -0
  116. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.assistant/SKILL.md +0 -0
  117. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/diagnostics.md +0 -0
  118. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/evaluation_guide.md +0 -0
  119. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/model_selection.md +0 -0
  120. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/training_paradigms.md +0 -0
  121. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/workflow.md +0 -0
  122. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_advanced.md +0 -0
  123. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_architectures.md +0 -0
  124. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_training.md +0 -0
  125. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/diagnostics.md +0 -0
  126. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/evaluation_guide.md +0 -0
  127. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/experiment_patterns.md +0 -0
  128. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/model_selection.md +0 -0
  129. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/training_paradigms.md +0 -0
  130. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/training_troubleshooting.md +0 -0
  131. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/workflow.md +0 -0
  132. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ellf_skills/skills/ellf-train.coding/scripts/ellf_logger.py +0 -0
  133. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/errors.py +0 -0
  134. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/helm.py +0 -0
  135. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/key_pair.py +0 -0
  136. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/main.py +0 -0
  137. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/messages.py +0 -0
  138. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/query.py +0 -0
  139. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/recipes_cookiecutter/cookiecutter.json +0 -0
  140. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/.gitignore +0 -0
  141. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/README.md.tmpl +0 -0
  142. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements-dev.in +0 -0
  143. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements.in +0 -0
  144. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/setup.py.tmpl +0 -0
  145. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/__init__.py +0 -0
  146. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/about.py +0 -0
  147. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/__init__.py +0 -0
  148. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/example_task.py +0 -0
  149. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/testing/__init__.py +0 -0
  150. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ty.py +0 -0
  151. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/ui.py +0 -0
  152. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/url.py +0 -0
  153. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli/util.py +0 -0
  154. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli.egg-info/SOURCES.txt +0 -0
  155. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli.egg-info/dependency_links.txt +0 -0
  156. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli.egg-info/entry_points.txt +0 -0
  157. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli.egg-info/not-zip-safe +0 -0
  158. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli.egg-info/requires.txt +0 -0
  159. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/ellf_cli.egg-info/top_level.txt +0 -0
  160. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/pyproject.toml +0 -0
  161. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/setup.cfg +0 -0
  162. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/setup.py +0 -0
  163. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_appdirs.py +0 -0
  164. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_auth.py +0 -0
  165. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_config.py +0 -0
  166. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_errors.py +0 -0
  167. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_files_cp.py +0 -0
  168. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_files_cp_helpers.py +0 -0
  169. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_info.py +0 -0
  170. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_invalid_secrets.py +0 -0
  171. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_key_pair.py +0 -0
  172. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_logout.py +0 -0
  173. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_main.py +0 -0
  174. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_org_select.py +0 -0
  175. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_plans.py +0 -0
  176. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_projects.py +0 -0
  177. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_query.py +0 -0
  178. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_recipe_file.py +0 -0
  179. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_recipes.py +0 -0
  180. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_state.py +0 -0
  181. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_support.py +0 -0
  182. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_ty.py +0 -0
  183. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_ui.py +0 -0
  184. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_ui_extras.py +0 -0
  185. {ellf_cli-7.0.0 → ellf_cli-10.0.1}/tests/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 7.0.0
3
+ Version: 10.0.1
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "title": "Ellf CLI",
3
3
  "name": "ellf-cli",
4
- "version": "7.0.0",
4
+ "version": "10.0.1",
5
5
  "summary": "Ellf Command Line Interface",
6
6
  "uri": "https://prodi.gy",
7
7
  "prog": "ellf",
@@ -128,11 +128,23 @@ def login(
128
128
  # below run against the chosen org's api_token, not whatever org
129
129
  # the device-flow login happened to land in.
130
130
  _select_and_persist_org(auth, org)
131
+ if claude:
132
+ # Claude setup needs only the packaged skill assets and the
133
+ # ellf-core token minted by the device flow above — not the
134
+ # cluster. Run it before cluster selection so cluster failures
135
+ # (token mint errors, unreachable broker, no cluster registered)
136
+ # can't block skill installation.
137
+ _install_claude_skills()
138
+ _configure_claude_mcp(auth)
131
139
  if not no_cluster:
132
140
  try:
133
141
  _select_and_persist_cluster(auth, cluster)
134
142
  auth.get_cluster_token(force_refresh=True)
135
- except EllfError as e:
143
+ except (EllfError, CLIError, httpx.HTTPError) as e:
144
+ # httpx transport errors (broker unreachable) and CLIError
145
+ # (no cluster registered, --cluster not matched) are just as
146
+ # common as EllfError token failures; all of them should get
147
+ # the --no-cluster hint instead of a raw traceback.
136
148
  err = Messages.E116.format(command=f"{cli.prog} login --no-cluster")
137
149
  raise CLIError(err, e)
138
150
  print_mutation_result(
@@ -140,9 +152,6 @@ def login(
140
152
  Messages.T012,
141
153
  as_json=as_json,
142
154
  )
143
- if claude:
144
- _install_claude_skills()
145
- _configure_claude_mcp(auth)
146
155
 
147
156
 
148
157
  @cli.command(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "prog": "ellf",
3
3
  "help": "Ellf Command Line Interface.",
4
- "version": "6.1.12",
4
+ "version": "6.1.5",
5
5
  "extra_key": "_extra",
6
6
  "commands": {
7
7
  "actions": {
@@ -275,7 +275,7 @@
275
275
  "orig_type": "bool"
276
276
  }
277
277
  ],
278
- "description": "\n Log in to your Ellf account. You normally don't need to call this\n manually. It will automatically authenticate when needed.\n ",
278
+ "description": "\nLog in to your Ellf account. You normally don't need to call this\nmanually. It will automatically authenticate when needed.\n",
279
279
  "allow_extra": false,
280
280
  "parent": null,
281
281
  "is_placeholder": false
@@ -310,7 +310,7 @@
310
310
  "orig_type": "bool"
311
311
  }
312
312
  ],
313
- "description": "\n Log out by deleting locally-stored auth tokens.\n\n PAM bearer tokens can't be revoked server-side, so this is a local\n operation: subsequent commands will trigger a fresh device-flow\n login. The cached tokens would have expired on their own within\n roughly an hour. Use ``--all`` to also reset the saved defaults\n (active org, cluster, project, etc.), e.g. when handing the\n machine to a different user.\n ",
313
+ "description": "\nLog out by deleting locally-stored auth tokens.\n\nPAM bearer tokens can't be revoked server-side, so this is a local\noperation: subsequent commands will trigger a fresh device-flow\nlogin. The cached tokens would have expired on their own within\nroughly an hour. Use ``--all`` to also reset the saved defaults\n(active org, cluster, project, etc.), e.g. when handing the\nmachine to a different user.\n",
314
314
  "allow_extra": false,
315
315
  "parent": null,
316
316
  "is_placeholder": false
@@ -356,15 +356,14 @@
356
356
  "api",
357
357
  "cluster",
358
358
  "id",
359
- "ci",
360
- "ellf-core"
359
+ "ci"
361
360
  ],
362
361
  "has_converter": false,
363
362
  "type": "str",
364
- "orig_type": "Literal[api, cluster, id, ci, ellf-core]"
363
+ "orig_type": "Literal[api, cluster, id, ci]"
365
364
  }
366
365
  ],
367
- "description": "\n Return an auth token for the current user\n ",
366
+ "description": "\nReturn an auth token for the current user\n",
368
367
  "allow_extra": false,
369
368
  "parent": null,
370
369
  "is_placeholder": false
@@ -440,7 +439,7 @@
440
439
  "orig_type": "list[Literal[tasks, actions, assets, datasets, paths]]"
441
440
  }
442
441
  ],
443
- "description": "\n Save the state of the current app JSON file. If an assets directory is\n provided, assets will be downloaded and referenced in the JSON accordingly.\n ",
442
+ "description": "\nSave the state of the current app JSON file. If an assets directory is\nprovided, assets will be downloaded and referenced in the JSON accordingly.\n",
444
443
  "allow_extra": false,
445
444
  "parent": null,
446
445
  "is_placeholder": false
@@ -475,7 +474,7 @@
475
474
  "orig_type": "bool"
476
475
  }
477
476
  ],
478
- "description": "\n Populate Ellf with data for projects, tasks, actions, assets and paths.\n ",
477
+ "description": "\nPopulate Ellf with data for projects, tasks, actions, assets and paths.\n",
479
478
  "allow_extra": false,
480
479
  "parent": null,
481
480
  "is_placeholder": false
@@ -565,7 +564,7 @@
565
564
  "orig_type": "List[str]"
566
565
  }
567
566
  ],
568
- "description": "\n Create a new action. The available action recipes are fetched from your\n cluster and are added as dynamic subcommands. You can see more details\n and available arguments by calling the subcommand with --help, e.g. create\n [name] --help\n ",
567
+ "description": "\nCreate a new action. The available action recipes are fetched from your\ncluster and are added as dynamic subcommands. You can see more details\nand available arguments by calling the subcommand with --help, e.g. create\n[name] --help\n",
569
568
  "allow_extra": true,
570
569
  "parent": "actions",
571
570
  "is_placeholder": false
@@ -600,7 +599,7 @@
600
599
  "orig_type": "bool"
601
600
  }
602
601
  ],
603
- "description": "\n List the actions on the cluster. By default, this includes their ID, name\n and current state, e.g. created or completed\n ",
602
+ "description": "\nList the actions on the cluster. By default, this includes their ID, name\nand current state, e.g. created or completed\n",
604
603
  "allow_extra": false,
605
604
  "parent": "actions",
606
605
  "is_placeholder": false
@@ -1059,7 +1058,7 @@
1059
1058
  "orig_type": "List[str]"
1060
1059
  }
1061
1060
  ],
1062
- "description": "\n Create a new agent. The available agent recipes are fetched from your\n cluster and are added as dynamic subcommands. You can see more details\n and available arguments by calling the subcommand with --help, e.g. create\n [name] --help\n ",
1061
+ "description": "\nCreate a new agent. The available agent recipes are fetched from your\ncluster and are added as dynamic subcommands. You can see more details\nand available arguments by calling the subcommand with --help, e.g. create\n[name] --help\n",
1063
1062
  "allow_extra": true,
1064
1063
  "parent": "agents",
1065
1064
  "is_placeholder": false
@@ -1168,7 +1167,7 @@
1168
1167
  "orig_type": "bool"
1169
1168
  }
1170
1169
  ],
1171
- "description": "\n List the agents on the cluster. By default, this includes their ID, name\n and current state, e.g. created or completed\n ",
1170
+ "description": "\nList the agents on the cluster. By default, this includes their ID, name\nand current state, e.g. created or completed\n",
1172
1171
  "allow_extra": false,
1173
1172
  "parent": "agents",
1174
1173
  "is_placeholder": false
@@ -1662,7 +1661,7 @@
1662
1661
  "orig_type": "bool"
1663
1662
  }
1664
1663
  ],
1665
- "description": "\n Get detailed info for an asset uploaded to the cluster and registered\n with Ellf\n ",
1664
+ "description": "\nGet detailed info for an asset uploaded to the cluster and registered\nwith Ellf\n",
1666
1665
  "allow_extra": false,
1667
1666
  "parent": "assets",
1668
1667
  "is_placeholder": false
@@ -1762,7 +1761,7 @@
1762
1761
  "orig_type": "bool"
1763
1762
  }
1764
1763
  ],
1765
- "description": "\n Create an asset on the cluster and register it with Ellf. Assets\n point to files or directories you control. The Ellf server only has\n a reference to them. This command doesn't transfer any data. See `ellf files`\n for utilities to transfer files to and from your cluster\n ",
1764
+ "description": "\nCreate an asset on the cluster and register it with Ellf. Assets\npoint to files or directories you control. The Ellf server only has\na reference to them. This command doesn't transfer any data. See `ellf files`\nfor utilities to transfer files to and from your cluster\n",
1766
1765
  "allow_extra": false,
1767
1766
  "parent": "assets",
1768
1767
  "is_placeholder": false
@@ -1833,7 +1832,7 @@
1833
1832
  "import": {
1834
1833
  "name": "import",
1835
1834
  "args": [],
1836
- "description": "Read a serialised FileSecrets blob from stdin and write it to\n the local secrets file.\n\n Counterpart to ``ellf auth push``. Existing local auth state is\n overwritten; the file is written 0600 by FileSecrets.save.\n ",
1835
+ "description": "Read a serialised FileSecrets blob from stdin and write it to\nthe local secrets file.\n\nCounterpart to ``ellf auth push``. Existing local auth state is\noverwritten; the file is written 0600 by FileSecrets.save.\n",
1837
1836
  "allow_extra": false,
1838
1837
  "parent": "auth",
1839
1838
  "is_placeholder": false
@@ -1868,7 +1867,7 @@
1868
1867
  "orig_type": "str"
1869
1868
  }
1870
1869
  ],
1871
- "description": "Push local auth state to a remote machine via SSH.\n\n Reads the local FileSecrets, JSON-serialises it, and pipes it to\n ``<remote_ellf> auth import`` over an SSH connection to *host*.\n Authentication is delegated to ssh \u2014 anything in your ssh config\n (host aliases, ProxyJump, key-based auth) just works.\n\n The pushed blob includes id_token, api_token, and any cached\n broker_tokens. id_token expiry is dictated by the issuer (typically\n ~1h), so this is a \"give the remote a usable session\" operation,\n not a permanent provisioning. Re-run when the token expires.\n ",
1870
+ "description": "Push local auth state to a remote machine via SSH.\n\nReads the local FileSecrets, JSON-serialises it, and pipes it to\n``<remote_ellf> auth import`` over an SSH connection to *host*.\nAuthentication is delegated to ssh \u2014 anything in your ssh config\n(host aliases, ProxyJump, key-based auth) just works.\n\nThe pushed blob includes id_token, api_token, and any cached\nbroker_tokens. id_token expiry is dictated by the issuer (typically\n~1h), so this is a \"give the remote a usable session\" operation,\nnot a permanent provisioning. Re-run when the token expires.\n",
1872
1871
  "allow_extra": false,
1873
1872
  "parent": "auth",
1874
1873
  "is_placeholder": false
@@ -1940,7 +1939,7 @@
1940
1939
  "orig_type": "bool"
1941
1940
  }
1942
1941
  ],
1943
- "description": "Switch the active cluster.\n\n Looks up the cluster by name or ID via PAM. With no argument and\n multiple clusters available, prompts interactively in a TTY.\n ",
1942
+ "description": "Switch the active cluster.\n\nLooks up the cluster by name or ID via PAM. With no argument and\nmultiple clusters available, prompts interactively in a TTY.\n",
1944
1943
  "allow_extra": false,
1945
1944
  "parent": "clusters",
1946
1945
  "is_placeholder": false
@@ -2084,7 +2083,7 @@
2084
2083
  "orig_type": "bool"
2085
2084
  }
2086
2085
  ],
2087
- "description": "\n Delete a cluster from PAM. This only removes PAM's record\n of it. The cluster itself will continue to exist - you need\n to shut it down separately.\n ",
2086
+ "description": "\nDelete a cluster from PAM. This only removes PAM's record\nof it. The cluster itself will continue to exist - you need\nto shut it down separately.\n",
2088
2087
  "allow_extra": false,
2089
2088
  "parent": "clusters",
2090
2089
  "is_placeholder": false
@@ -2184,7 +2183,7 @@
2184
2183
  "orig_type": "bool"
2185
2184
  }
2186
2185
  ],
2187
- "description": "Check the health of a cluster deployment.\n\n Runs CLI-side connectivity checks against the cluster and PAM.\n Use --deep (or supply --s3-bucket / --nfs-path / --recipe) to also\n trigger cluster-side deployment checks via the broker's /v1/check\n endpoints (K8s API, NFS, S3, recipe execution, DB).\n ",
2186
+ "description": "Check the health of a cluster deployment.\n\nRuns CLI-side connectivity checks against the cluster and PAM.\nUse --deep (or supply --s3-bucket / --nfs-path / --recipe) to also\ntrigger cluster-side deployment checks via the broker's /v1/check\nendpoints (K8s API, NFS, S3, recipe execution, DB).\n",
2188
2187
  "allow_extra": false,
2189
2188
  "parent": "clusters",
2190
2189
  "is_placeholder": false
@@ -2280,7 +2279,7 @@
2280
2279
  "orig_type": "bool"
2281
2280
  }
2282
2281
  ],
2283
- "description": "Rotate the cluster RSA keypair.\n\n Generates a new keypair, updates the cluster record in PAM with the\n new public key, patches the K8s secret with the new private key,\n and restarts the cluster deployment.\n ",
2282
+ "description": "Rotate the cluster RSA keypair.\n\nGenerates a new keypair, updates the cluster record in PAM with the\nnew public key, patches the K8s secret with the new private key,\nand restarts the cluster deployment.\n",
2284
2283
  "allow_extra": false,
2285
2284
  "parent": "clusters",
2286
2285
  "is_placeholder": false
@@ -3030,7 +3029,7 @@
3030
3029
  "orig_type": "str"
3031
3030
  }
3032
3031
  ],
3033
- "description": "Export all the examples from a dataset and save it in the designated file as\n JSONL (newline-delimited JSON).\n ",
3032
+ "description": "Export all the examples from a dataset and save it in the designated file as\nJSONL (newline-delimited JSON).\n",
3034
3033
  "allow_extra": false,
3035
3034
  "parent": "datasets",
3036
3035
  "is_placeholder": false
@@ -3465,7 +3464,7 @@
3465
3464
  "orig_type": "bool"
3466
3465
  }
3467
3466
  ],
3468
- "description": "Deploy or upgrade the Ellf Helm chart.\n\n Creates the namespace, image pull secret, cluster keypair secret,\n then runs helm upgrade --install with the provided values.\n ",
3467
+ "description": "Deploy or upgrade the Ellf Helm chart.\n\nCreates the namespace, image pull secret, cluster keypair secret,\nthen runs helm upgrade --install with the provided values.\n",
3469
3468
  "allow_extra": false,
3470
3469
  "parent": "infra",
3471
3470
  "is_placeholder": false
@@ -3709,7 +3708,7 @@
3709
3708
  "orig_type": "str"
3710
3709
  }
3711
3710
  ],
3712
- "description": "Install cluster infrastructure prerequisites (Traefik, cert-manager).\n\n These operations are idempotent and safe to re-run.\n ",
3711
+ "description": "Install cluster infrastructure prerequisites (Traefik, cert-manager).\n\nThese operations are idempotent and safe to re-run.\n",
3713
3712
  "allow_extra": false,
3714
3713
  "parent": "infra",
3715
3714
  "is_placeholder": false
@@ -3992,7 +3991,7 @@
3992
3991
  "orig_type": "str"
3993
3992
  }
3994
3993
  ],
3995
- "description": "Manage TLS certificates for local cluster access.\n\n Use --self-signed when you have direct kubectl access to the cluster.\n Use --setup HOST to do everything from your laptop over SSH.\n Use --trust HOST to fetch and install an existing CA from a remote cluster.\n ",
3994
+ "description": "Manage TLS certificates for local cluster access.\n\nUse --self-signed when you have direct kubectl access to the cluster.\nUse --setup HOST to do everything from your laptop over SSH.\nUse --trust HOST to fetch and install an existing CA from a remote cluster.\n",
3996
3995
  "allow_extra": false,
3997
3996
  "parent": "infra",
3998
3997
  "is_placeholder": false
@@ -4016,7 +4015,7 @@
4016
4015
  "orig_type": "str"
4017
4016
  }
4018
4017
  ],
4019
- "description": "\n Run a job directly on the cluster from a YAML spec file, bypassing PAM.\n ",
4018
+ "description": "\nRun a job directly on the cluster from a YAML spec file, bypassing PAM.\n",
4020
4019
  "allow_extra": false,
4021
4020
  "parent": "jobs",
4022
4021
  "is_placeholder": false
@@ -5094,7 +5093,7 @@
5094
5093
  "orig_type": "str"
5095
5094
  }
5096
5095
  ],
5097
- "description": "\n Upload and advertise a recipes package from your Python environment.\n ",
5096
+ "description": "\nUpload and advertise a recipes package from your Python environment.\n",
5098
5097
  "allow_extra": false,
5099
5098
  "parent": "publish",
5100
5099
  "is_placeholder": false
@@ -5207,7 +5206,7 @@
5207
5206
  "orig_type": "bool"
5208
5207
  }
5209
5208
  ],
5210
- "description": "\n Transfer data to the cluster, and advertise it to Ellf.\n\n These steps can also be done separately. See `ellf files` to transfer\n data to the cluster without creating an Asset record for it, and\n `ellf assets create` to create an Asset without transfer.\n ",
5209
+ "description": "\nTransfer data to the cluster, and advertise it to Ellf.\n\nThese steps can also be done separately. See `ellf files` to transfer\ndata to the cluster without creating an Asset record for it, and\n`ellf assets create` to create an Asset without transfer.\n",
5211
5210
  "allow_extra": false,
5212
5211
  "parent": "publish",
5213
5212
  "is_placeholder": false
@@ -5762,7 +5761,7 @@
5762
5761
  "orig_type": "List[str]"
5763
5762
  }
5764
5763
  ],
5765
- "description": "\n Create a new service. The available service recipes are fetched from your\n cluster and are added as dynamic subcommands. You can see more details\n and available arguments by calling the subcommand with --help, e.g. create\n [name] --help\n ",
5764
+ "description": "\nCreate a new service. The available service recipes are fetched from your\ncluster and are added as dynamic subcommands. You can see more details\nand available arguments by calling the subcommand with --help, e.g. create\n[name] --help\n",
5766
5765
  "allow_extra": true,
5767
5766
  "parent": "services",
5768
5767
  "is_placeholder": false
@@ -6228,7 +6227,7 @@
6228
6227
  "orig_type": "bool"
6229
6228
  }
6230
6229
  ],
6231
- "description": "Print the bearer-token-authenticated URL for a service.\n\n Mints a fresh 90-day token via ``POST /v1/service/issue-token`` and\n formats it together with the service's public URL so the result can\n be dropped into an MCP client config or curl invocation:\n\n curl -H \"Authorization: Bearer <token>\" <url>\n\n Use ``services rotate-token`` to mint a new token without printing\n the URL again.\n ",
6230
+ "description": "Print the bearer-token-authenticated URL for a service.\n\nMints a fresh 90-day token via ``POST /v1/service/issue-token`` and\nformats it together with the service's public URL so the result can\nbe dropped into an MCP client config or curl invocation:\n\n curl -H \"Authorization: Bearer <token>\" <url>\n\nUse ``services rotate-token`` to mint a new token without printing\nthe URL again.\n",
6232
6231
  "allow_extra": false,
6233
6232
  "parent": "services",
6234
6233
  "is_placeholder": false
@@ -6289,7 +6288,7 @@
6289
6288
  "orig_type": "bool"
6290
6289
  }
6291
6290
  ],
6292
- "description": "Mint a fresh 90-day token for an existing service.\n\n Issuing a new token does not invalidate previous ones -- they remain\n valid until their own expiration. Use this when the previous token\n is leaked, or when you want a longer remaining window for an MCP\n client config.\n ",
6291
+ "description": "Mint a fresh 90-day token for an existing service.\n\nIssuing a new token does not invalidate previous ones -- they remain\nvalid until their own expiration. Use this when the previous token\nis leaked, or when you want a longer remaining window for an MCP\nclient config.\n",
6293
6292
  "allow_extra": false,
6294
6293
  "parent": "services",
6295
6294
  "is_placeholder": false
@@ -6509,7 +6508,7 @@
6509
6508
  "orig_type": "List[str]"
6510
6509
  }
6511
6510
  ],
6512
- "description": "\n Create a new task. The available task recipes are fetched from your\n cluster and are added as dynamic subcommands. You can see more details\n and available arguments by calling the subcommand with --help, e.g. create\n [name] --help\n ",
6511
+ "description": "\nCreate a new task. The available task recipes are fetched from your\ncluster and are added as dynamic subcommands. You can see more details\nand available arguments by calling the subcommand with --help, e.g. create\n[name] --help\n",
6513
6512
  "allow_extra": true,
6514
6513
  "parent": "tasks",
6515
6514
  "is_placeholder": false
@@ -6544,7 +6543,7 @@
6544
6543
  "orig_type": "bool"
6545
6544
  }
6546
6545
  ],
6547
- "description": "\n List the tasks on the cluster. By default, this includes their ID, name\n and current state, e.g. created or completed\n ",
6546
+ "description": "\nList the tasks on the cluster. By default, this includes their ID, name\nand current state, e.g. created or completed\n",
6548
6547
  "allow_extra": false,
6549
6548
  "parent": "tasks",
6550
6549
  "is_placeholder": false
@@ -6975,7 +6974,7 @@
6975
6974
  "orig_type": "bool"
6976
6975
  }
6977
6976
  ],
6978
- "description": "Fetch a batch of questions from a running annotation task.\n\n Mirrors the web app: asks the broker for a Prodigy login token, then talks\n to the task pod directly via its public task_url. Note that requesting a\n batch reserves those questions for this CLI's session \u2014 they will not be\n handed to other annotators until they are answered or another session\n runs out of work and steals them.\n ",
6977
+ "description": "Fetch a batch of questions from a running annotation task.\n\nMirrors the web app: asks the broker for a Prodigy login token, then talks\nto the task pod directly via its public task_url. Note that requesting a\nbatch reserves those questions for this CLI's session \u2014 they will not be\nhanded to other annotators until they are answered or another session\nruns out of work and steals them.\n",
6979
6978
  "allow_extra": false,
6980
6979
  "parent": "tasks",
6981
6980
  "is_placeholder": false
@@ -2,6 +2,7 @@
2
2
  name: ellf-annotate
3
3
  description: "Set up and launch annotation from the coding environment once the methodology, schema, and data are ready. Use when the user wants to start annotation on the Ellf cluster, run a local Prodigy annotation server, choose between built-in Ellf and built-in Prodigy recipes, verify that annotation is ready to launch, preview the annotation setup, or determine whether a new custom recipe is needed. Also trigger on \"I want to annotate\", \"start a local Prodigy server\", \"launch annotation on the cluster\", \"which recipe should I use\", \"can I run this locally\", \"set up review\", or \"help me run annotation\". This skill is the annotation readiness gatekeeper: it applies the audit checklist before launch, prefers built-in workflows when possible, and delegates to `/ellf-prodigy` when a new custom recipe must be implemented."
4
4
  argument-hint: "[describe what you want to annotate]"
5
+ allowed-tools: Bash(ellf info defaults:*)
5
6
  ---
6
7
 
7
8
  # Launch Annotation From Coding
@@ -10,6 +11,13 @@ Help the user get from an annotation-ready plan to a working annotation process.
10
11
 
11
12
  $ARGUMENTS
12
13
 
14
+ ## Current Ellf session context
15
+
16
+ The block below is auto-filled from your local Ellf CLI each time this skill loads. Read it instead of trying to discover the project, cluster, or task yourself. There is **no** `ellf project current` / `ellf projects current` command — these saved defaults are what such a command would return, and most `ellf` commands fall back to them automatically. To change one, run `ellf config <project|task|action|agent|...> <name_or_id>`.
17
+
18
+ Saved CLI defaults:
19
+ !`ellf info defaults`
20
+
13
21
  ## Your role
14
22
 
15
23
  You are responsible for:
@@ -2,6 +2,7 @@
2
2
  name: ellf-monitor
3
3
  description: "Monitors Ellf jobs, local Prodigy servers, training progress, and cluster health — keeps raw logs out of context and produces structured summaries. Includes a structured training check script, alert classification (overfitting, plateau, NaN loss, spikes), annotation metrics, and diagnostic routing. Use proactively after launching any job, not just when the user asks. Also trigger on status checks, log inspection, 'how's the task doing', 'what failed', or training metric questions."
4
4
  argument-hint: "[job name, job type, output dir, or 'cluster']"
5
+ allowed-tools: Bash(ellf info defaults:*)
5
6
  ---
6
7
 
7
8
  # Monitor Jobs From Coding
@@ -10,6 +11,13 @@ You are the monitoring and diagnosis skill for the coding environment.
10
11
 
11
12
  $ARGUMENTS
12
13
 
14
+ ## Current Ellf session context
15
+
16
+ The block below is auto-filled from your local Ellf CLI each time this skill loads. Read it instead of trying to discover the project, cluster, or task yourself. There is **no** `ellf project current` / `ellf projects current` command — these saved defaults are what such a command would return, and most `ellf` commands fall back to them automatically. To change one, run `ellf config <project|task|action|agent|...> <name_or_id>`.
17
+
18
+ Saved CLI defaults:
19
+ !`ellf info defaults`
20
+
13
21
  ## Contents
14
22
  - Scope — what this skill does and doesn't do
15
23
  - Monitoring surfaces — cluster jobs, local runs, Prodigy servers, cluster health
@@ -2,6 +2,7 @@
2
2
  name: ellf-ops
3
3
  description: "Executes Ellf operations from the coding environment: creating, starting, stopping, or inspecting tasks, actions, or agents; managing assets, datasets, files, secrets, or packages; publishing data or code; managing projects, path aliases, or cluster health. Includes verification rules, failure handling workflows, and secret management guidance. Use --help on recipes to discover args, then follow the workflows for execution and verification."
4
4
  argument-hint: "[ready launch spec or job operation]"
5
+ allowed-tools: Bash(ellf info defaults:*)
5
6
  ---
6
7
 
7
8
  # Execute Operations From Coding
@@ -10,6 +11,13 @@ You are the execution skill for operational workflows in the coding environment.
10
11
 
11
12
  $ARGUMENTS
12
13
 
14
+ ## Current Ellf session context
15
+
16
+ The block below is auto-filled from your local Ellf CLI each time this skill loads. Read it instead of trying to discover the project, cluster, task, action, or agent yourself. There is **no** `ellf project current` / `ellf projects current` command — these saved defaults are what such a command would return, and most `ellf` commands fall back to them automatically. To change one, run `ellf config <project|task|action|agent|...> <name_or_id>`.
17
+
18
+ Saved CLI defaults:
19
+ !`ellf info defaults`
20
+
13
21
  ## Scope
14
22
 
15
23
  You execute ready operations. You do not:
@@ -2,6 +2,7 @@
2
2
  name: ellf-prodigy
3
3
  description: Develop and test custom Prodigy annotation recipes — both standalone Prodigy and Ellf. Has templates, API reference, built-in recipe catalog, and a lint script. Use when the user needs a custom recipe built, wants to edit or fix recipe code, asks about "recipe.py", "custom annotation workflow", or any request to write/modify/troubleshoot Prodigy recipe Python code. Also trigger for porting standalone recipes to Ellf or vice versa.
4
4
  argument-hint: "[describe your annotation task or recipe to edit]"
5
+ allowed-tools: Bash(ellf info defaults:*), Bash(ellf plans list:*)
5
6
  ---
6
7
 
7
8
  # Prodigy Recipe Developer
@@ -10,6 +11,16 @@ You develop and test custom Prodigy annotation recipes.
10
11
 
11
12
  $ARGUMENTS
12
13
 
14
+ ## Current Ellf session context
15
+
16
+ The block below is auto-filled from your local Ellf CLI each time this skill loads. Read it instead of trying to discover the project or other defaults yourself. There is **no** `ellf project current` / `ellf projects current` command — these saved defaults are what such a command would return, and most `ellf` commands fall back to them automatically. To change one, run `ellf config <project|task|action|agent|...> <name_or_id>`.
17
+
18
+ Saved CLI defaults:
19
+ !`ellf info defaults`
20
+
21
+ Plans in the saved project (`ellf plans list` and the other `ellf plans` commands default to it):
22
+ !`ellf plans list`
23
+
13
24
  ## Setup
14
25
 
15
26
  This is a coding-only skill. Work from the local coding environment and current
@@ -36,9 +47,10 @@ current codebase, and existing recipe package structure.
36
47
  every task needs a custom recipe. If they still want custom, understand what
37
48
  the built-in is missing.
38
49
 
39
- 2. **Check the shared project plan** using the current local project context.
40
- Extract task type, labels, data source, runtime target, and any recipe
41
- recommendations already agreed elsewhere.
50
+ 2. **Check the shared project plan.** The injected "Current Ellf session context"
51
+ above lists the plans in the saved project read the relevant one with
52
+ `ellf plans read` (it defaults to the saved project). Extract task type, labels,
53
+ data source, runtime target, and any recipe recommendations already agreed elsewhere.
42
54
 
43
55
  3. **Gather requirements** you don't already have: annotation task type, labels,
44
56
  data source, model assistance (manual / model-correct / active learning /
@@ -2,6 +2,7 @@
2
2
  name: ellf-project
3
3
  description: Plan an NLP project end-to-end with an opinionated consultant. Covers problem framing, data strategy, annotation, pipeline design, evaluation, and deployment planning, grounded in spaCy, Prodigy, Ellf workflows and applied NLP best practices. Use whenever the user asks how to approach an NLP task, needs help deciding between rules, ML, and LLMs, wants advice on label scheme design, needs pipeline architecture guidance, asks how to break a vague NLP problem into concrete steps, or says things like "how should I build this", "what's the best approach for", "help me plan", "I need to extract/classify/annotate", "how do I structure this project", or "what should I do next". Also trigger when the user seems unsure about their NLP approach, has a vague requirement that needs scoping, or needs a shared project plan created or updated.
4
4
  argument-hint: "[describe your NLP problem]"
5
+ allowed-tools: Bash(ellf info defaults:*), Bash(ellf plans list:*)
5
6
  ---
6
7
 
7
8
  # NLP Project Consultant
@@ -13,6 +14,16 @@ You do not dump generic questionnaires. You listen, react, recommend, and ask th
13
14
 
14
15
  $ARGUMENTS
15
16
 
17
+ ## Current Ellf session context
18
+
19
+ The block below is auto-filled from your local Ellf CLI each time this skill loads. Read it instead of trying to discover the project or other defaults yourself. There is **no** `ellf project current` / `ellf projects current` command — these saved defaults are what such a command would return, and most `ellf` commands fall back to them automatically. To change one, run `ellf config <project|task|action|agent|...> <name_or_id>`.
20
+
21
+ Saved CLI defaults:
22
+ !`ellf info defaults`
23
+
24
+ Plans in the saved project (`ellf plans list` and the other `ellf plans` commands default to it):
25
+ !`ellf plans list`
26
+
16
27
  ## Contents
17
28
  - Your role — planning, not implementation
18
29
  - Shared project plan — local CLI plan access and lifecycle
@@ -65,7 +76,7 @@ In the coding environment, use the local `ellf plans` workflow. `<project_id>` i
65
76
  - `ellf plans revisions <name_or_id> [<project_id>] [--size N] [--after <cursor>]` — paginated history of one plan, newest first. `name_or_id` is required here (no default).
66
77
  - `ellf plans delete <name_or_id> [<project_id>]` — delete a plan by name or UUID.
67
78
 
68
- If you need to resolve the current project ID first, use the local project context before reading or writing plans. Do not guess the project ID.
79
+ The `ellf plans` commands already default to the saved project when `<project_id>` is omitted, so you usually don't need to resolve it. If you do need the current project ID explicitly, read it from `ellf info defaults` (the `project` field). Do not guess the project ID, and note there is no `ellf project`/`ellf projects current` command — use `ellf info defaults` to read the saved default and `ellf config project <name_or_id>` to change it.
69
80
 
70
81
  Do not ask the user where to store the plan.
71
82
 
@@ -2,6 +2,7 @@
2
2
  name: ellf-support
3
3
  description: Prepare and send a support request from the coding environment when the user wants human help from the Ellf team. Use when the user wants to escalate an issue, asks for human review, wants to contact support, or says things like "I need support", "can someone look at this", "send this to the Ellf team", or "I'm stuck". This skill gathers the issue, summarizes the current state, asks whether to attach the full Claude Code transcript, and sends the request with `ellf support create`.
4
4
  argument-hint: "[describe your issue]"
5
+ allowed-tools: Bash(ellf info defaults:*)
5
6
  ---
6
7
 
7
8
  # Human Support From Coding
@@ -10,6 +11,13 @@ Help the user escalate to human support cleanly and accurately.
10
11
 
11
12
  $ARGUMENTS
12
13
 
14
+ ## Current Ellf session context
15
+
16
+ The block below is auto-filled from your local Ellf CLI each time this skill loads. Use the saved `project` here as the default target for the support request — do not try to discover it with `ellf project current` / `ellf projects current` (no such command). If the saved project looks wrong or stale for this request, fall back to `ellf projects list --json` and confirm with the user (see "Resolve the target project" below).
17
+
18
+ Saved CLI defaults:
19
+ !`ellf info defaults`
20
+
13
21
  ## Scope
14
22
 
15
23
  You are not implementing a fix here. Your job is to:
@@ -57,8 +65,8 @@ Use the current conversation first.
57
65
 
58
66
  Resolve the target project before you submit the request.
59
67
 
60
- - If the current project is explicit from local project context or prior confirmed
61
- state, use it.
68
+ - If the current project is explicit (the saved `project` in the injected session
69
+ context above, or prior confirmed state), use it.
62
70
  - If there is any ambiguity about which project the support request belongs to,
63
71
  use `ellf projects list --json` to gather candidates, then use `AskUserQuestion`
64
72
  to confirm the project with the user before running `ellf support create`.
@@ -2,6 +2,7 @@
2
2
  name: ellf-train
3
3
  description: "Trains spaCy models locally or on the Ellf cluster — from config generation and experiment design through training execution to result interpretation and troubleshooting. Covers architecture selection, model selection, training diagnostics, and evaluation methodology. Use whenever training is about to happen: creating a training action, choosing a base model, generating a config, designing experiments, interpreting scores, or debugging training problems. Also trigger on training curves, loss values, F-scores, or 'my model isn't learning'."
4
4
  argument-hint: "[describe what you want to train, or provide a dataset name]"
5
+ allowed-tools: Bash(ellf info defaults:*), Bash(ellf plans list:*)
5
6
  ---
6
7
 
7
8
  # NLP Model Training
@@ -10,11 +11,21 @@ You help users go from annotated data to a trained spaCy model — locally or on
10
11
 
11
12
  $ARGUMENTS
12
13
 
14
+ ## Current Ellf session context
15
+
16
+ The block below is auto-filled from your local Ellf CLI each time this skill loads. Read it instead of trying to discover the project or other defaults yourself. There is **no** `ellf project current` / `ellf projects current` command — these saved defaults are what such a command would return, and most `ellf` commands fall back to them automatically. To change one, run `ellf config <project|task|action|agent|...> <name_or_id>`.
17
+
18
+ Saved CLI defaults:
19
+ !`ellf info defaults`
20
+
21
+ Plans in the saved project (`ellf plans list` and the other `ellf plans` commands default to it):
22
+ !`ellf plans list`
23
+
13
24
  ## Setup
14
25
 
15
26
  1. **Read `${CLAUDE_SKILL_DIR}/references/workflow.md`** — this is your decision flowchart. It tells you where you are in the training process and what to do next. Read it on every invocation.
16
27
 
17
- 2. **Check for a shared project plan** using the current project context. Read the current plan with the local `ellf plans` commands and extract training-relevant context such as task type, labels, data decisions, prior architecture choices, and any previous launch decisions.
28
+ 2. **Check for a shared project plan.** The injected "Current Ellf session context" above already lists the plans in the saved project — pick the relevant one and read it with `ellf plans read` (it defaults to the saved project, so you don't resolve a project ID first). Extract training-relevant context such as task type, labels, data decisions, prior architecture choices, and any previous launch decisions.
18
29
 
19
30
  3. **Check for `training_history.md`** in the working directory. If found, the Current Status section tells you where things stand. Resume from there.
20
31
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 7.0.0
3
+ Version: 10.0.1
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
@@ -156,6 +156,64 @@ def test_install_claude_skills_with_packaged_plugin(tmp_path, monkeypatch):
156
156
  assert (dest / "ellf-patterns").is_dir()
157
157
 
158
158
 
159
+ def _patch_login_collaborators(monkeypatch, *, cluster_error=None):
160
+ """Patch login()'s collaborators so it can run without network access.
161
+
162
+ Returns (auth, install_mock, configure_mock). When ``cluster_error``
163
+ is given, cluster selection raises it.
164
+ """
165
+ from ellf_cli.commands import general
166
+
167
+ auth = MagicMock()
168
+ monkeypatch.setattr(general, "get_auth_state", lambda: auth)
169
+ monkeypatch.setattr(general, "_select_and_persist_org", MagicMock())
170
+ cluster_mock = MagicMock(side_effect=cluster_error)
171
+ monkeypatch.setattr(general, "_select_and_persist_cluster", cluster_mock)
172
+ install_mock = MagicMock()
173
+ configure_mock = MagicMock()
174
+ monkeypatch.setattr(general, "_install_claude_skills", install_mock)
175
+ monkeypatch.setattr(general, "_configure_claude_mcp", configure_mock)
176
+ return auth, install_mock, configure_mock
177
+
178
+
179
+ def test_login_claude_installs_skills_despite_cluster_failure(monkeypatch):
180
+ """Regression: cluster auth failure must not block Claude skill setup.
181
+
182
+ Skill install and MCP config only need the device-flow tokens, so
183
+ they run before cluster selection and survive any cluster error.
184
+ """
185
+ import pytest
186
+
187
+ from ellf_cli.commands import general
188
+ from ellf_cli.errors import CLIError, EllfError
189
+
190
+ auth, install_mock, configure_mock = _patch_login_collaborators(
191
+ monkeypatch, cluster_error=EllfError("cluster token mint failed")
192
+ )
193
+
194
+ with pytest.raises(CLIError):
195
+ general.login(claude=True)
196
+
197
+ install_mock.assert_called_once_with()
198
+ configure_mock.assert_called_once_with(auth)
199
+
200
+
201
+ def test_login_wraps_transport_and_cli_errors_with_no_cluster_hint(monkeypatch):
202
+ """Broker-unreachable (httpx) and no-cluster (CLIError) failures get the
203
+ same --no-cluster hint as EllfError instead of a raw traceback."""
204
+ import httpx
205
+ import pytest
206
+
207
+ from ellf_cli.commands import general
208
+ from ellf_cli.errors import CLIError
209
+
210
+ for error in (httpx.ConnectError("connection refused"), CLIError("no clusters")):
211
+ _patch_login_collaborators(monkeypatch, cluster_error=error)
212
+ with pytest.raises(CLIError) as exc_info:
213
+ general.login()
214
+ assert "--no-cluster" in str(exc_info.value)
215
+
216
+
159
217
  def _fake_membership(org_id, org_name="acme"):
160
218
  return SimpleNamespace(
161
219
  org_id=org_id,
File without changes
File without changes
File without changes
File without changes