ellf-cli 18.0.2__tar.gz → 18.0.5__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 (318) hide show
  1. {ellf_cli-18.0.2/ellf_cli.egg-info → ellf_cli-18.0.5}/PKG-INFO +1 -1
  2. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/README.md +4 -4
  3. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/users.py +22 -4
  4. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf.json +9 -9
  5. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_agent_recipe.py +8 -1
  6. ellf_cli-18.0.5/ellf_cli/version/18.0.2_2026-09-13-06-36-33_patch_176bb944-1c49-4dd3-a001-8fce908825a0 +3 -0
  7. ellf_cli-18.0.5/ellf_cli/version/18.0.3_2026-09-13-12-32-46_patch_58e5ce3a-f2a7-4789-b2cd-5cc75c72b6ec +3 -0
  8. ellf_cli-18.0.5/ellf_cli/version/18.0.4_2026-09-13-12-45-14_patch_b6c79d55-8f85-4f47-a304-df52b122c38c +3 -0
  9. {ellf_cli-18.0.2 → ellf_cli-18.0.5/ellf_cli.egg-info}/PKG-INFO +1 -1
  10. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli.egg-info/SOURCES.txt +4 -0
  11. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_users_assign.py +10 -3
  12. ellf_cli-18.0.5/tests/test_users_list.py +77 -0
  13. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/LICENSE +0 -0
  14. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/MANIFEST.in +0 -0
  15. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/__init__.py +0 -0
  16. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/__main__.py +0 -0
  17. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/about.json +0 -0
  18. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/about.py +0 -0
  19. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/appdirs.py +0 -0
  20. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/auth.py +0 -0
  21. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/cli.py +0 -0
  22. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/cloud/__init__.py +0 -0
  23. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/cloud/gcp.py +0 -0
  24. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/cluster_config.py +0 -0
  25. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/__init__.py +0 -0
  26. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/_cluster_select.py +0 -0
  27. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/_org_select.py +0 -0
  28. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/_project_scope.py +0 -0
  29. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/_recipe_file.py +0 -0
  30. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/_recipe_subcommand.py +0 -0
  31. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/_state.py +0 -0
  32. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/_usage.py +0 -0
  33. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/actions.py +0 -0
  34. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/agents.py +0 -0
  35. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/assets.py +0 -0
  36. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/auth.py +0 -0
  37. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/clusters.py +0 -0
  38. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/config.py +0 -0
  39. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/datasets.py +0 -0
  40. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/files/__init__.py +0 -0
  41. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/files/cp.py +0 -0
  42. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/files/ls.py +0 -0
  43. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/files/rm.py +0 -0
  44. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/files/rsync.py +0 -0
  45. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/files/stats.py +0 -0
  46. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/general.py +0 -0
  47. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/import_export.py +0 -0
  48. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/infra/__init__.py +0 -0
  49. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/infra/_config_io.py +0 -0
  50. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/infra/_helpers.py +0 -0
  51. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/infra/configure.py +0 -0
  52. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/infra/deploy.py +0 -0
  53. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/infra/init.py +0 -0
  54. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/infra/init_values.py +0 -0
  55. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/infra/provision.py +0 -0
  56. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/infra/register.py +0 -0
  57. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/infra/setup.py +0 -0
  58. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/infra/start.py +0 -0
  59. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/infra/terraform.py +0 -0
  60. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/infra/tls.py +0 -0
  61. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/jobs.py +0 -0
  62. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/packages.py +0 -0
  63. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/paths.py +0 -0
  64. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/plans.py +0 -0
  65. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/projects.py +0 -0
  66. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/publish_code.py +0 -0
  67. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/publish_data.py +0 -0
  68. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/recipes.py +0 -0
  69. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/secrets.py +0 -0
  70. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/services.py +0 -0
  71. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/support.py +0 -0
  72. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/tasks.py +0 -0
  73. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/commands/todos.py +0 -0
  74. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/config.py +0 -0
  75. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/.claude-plugin/plugin.json +0 -0
  76. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/.gitignore +0 -0
  77. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skill_variants.json +0 -0
  78. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/SKILL.md +0 -0
  79. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/references/annotation_audit.md +0 -0
  80. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/references/builtin_ellf_annotation_recipes.md +0 -0
  81. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/SKILL.md +0 -0
  82. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/annotation_audit.md +0 -0
  83. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/builtin_ellf_annotation_recipes.md +0 -0
  84. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/builtin_prodigy_recipes.md +0 -0
  85. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-ask/SKILL.md +0 -0
  86. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-handoff/SKILL.md +0 -0
  87. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/SKILL.md +0 -0
  88. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/references/annotation_metrics.md +0 -0
  89. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/references/training_monitoring.md +0 -0
  90. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/SKILL.md +0 -0
  91. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/references/annotation_metrics.md +0 -0
  92. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/references/training_monitoring.md +0 -0
  93. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/scripts/check_training.py +0 -0
  94. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-ops.assistant/SKILL.md +0 -0
  95. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-ops.coding/SKILL.md +0 -0
  96. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-ops.coding/references/data_infra_cli.md +0 -0
  97. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-ops.coding/scripts/run_job.py +0 -0
  98. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-patterns/SKILL.md +0 -0
  99. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-patterns/references/pattern_strategies.md +0 -0
  100. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/SKILL.md +0 -0
  101. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_action_recipe.py +0 -0
  102. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_blocks_ui.py +0 -0
  103. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_correct.py +0 -0
  104. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_custom_ui.py +0 -0
  105. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_manual.py +0 -0
  106. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_pages_ui.py +0 -0
  107. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_routing.py +0 -0
  108. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_task_recipe.py +0 -0
  109. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_teach.py +0 -0
  110. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/builtin_recipes.md +0 -0
  111. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/ellf_recipe_sdk.md +0 -0
  112. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/lint_recipe.py +0 -0
  113. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/prodigy_recipe_api.md +0 -0
  114. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/template_index.md +0 -0
  115. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-project.assistant/SKILL.md +0 -0
  116. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/consulting_patterns.md +0 -0
  117. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/explosion_strategy.md +0 -0
  118. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/prodigy_llm_bot.md +0 -0
  119. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-project.coding/SKILL.md +0 -0
  120. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/consulting_patterns.md +0 -0
  121. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/explosion_strategy.md +0 -0
  122. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/prodigy_llm_bot.md +0 -0
  123. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-support.assistant/SKILL.md +0 -0
  124. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-support.coding/SKILL.md +0 -0
  125. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-todo/SKILL.md +0 -0
  126. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.assistant/SKILL.md +0 -0
  127. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/diagnostics.md +0 -0
  128. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/evaluation_guide.md +0 -0
  129. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/model_selection.md +0 -0
  130. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/training_paradigms.md +0 -0
  131. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/workflow.md +0 -0
  132. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.coding/SKILL.md +0 -0
  133. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_advanced.md +0 -0
  134. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_architectures.md +0 -0
  135. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_training.md +0 -0
  136. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/diagnostics.md +0 -0
  137. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/evaluation_guide.md +0 -0
  138. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/experiment_patterns.md +0 -0
  139. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/model_selection.md +0 -0
  140. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/training_paradigms.md +0 -0
  141. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/training_troubleshooting.md +0 -0
  142. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/workflow.md +0 -0
  143. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ellf_skills/skills/ellf-train.coding/scripts/ellf_logger.py +0 -0
  144. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/errors.py +0 -0
  145. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/helm.py +0 -0
  146. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/interactivity.py +0 -0
  147. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/key_pair.py +0 -0
  148. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/main.py +0 -0
  149. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/messages.py +0 -0
  150. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/pypi_auth.py +0 -0
  151. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/query.py +0 -0
  152. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/recipes_cookiecutter/cookiecutter.json +0 -0
  153. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/.gitignore +0 -0
  154. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/README.md.tmpl +0 -0
  155. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements-dev.in +0 -0
  156. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements.in +0 -0
  157. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/setup.py.tmpl +0 -0
  158. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/__init__.py +0 -0
  159. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/about.py +0 -0
  160. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/__init__.py +0 -0
  161. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/example_task.py +0 -0
  162. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/testing/__init__.py +0 -0
  163. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ty.py +0 -0
  164. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/ui.py +0 -0
  165. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/url.py +0 -0
  166. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/util.py +0 -0
  167. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.114_2026-08-19-08-36-57__1a4e37c1-471e-4a81-b4d5-1ffe7dec3a61 +0 -0
  168. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.114_2026-08-19-09-25-21_patch_33ff1e26-0e5e-46d8-8052-ab1d032e8b6c +0 -0
  169. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.115_2026-08-19-09-27-13_patch_4ac728c3-0342-4a36-adbc-e28d2d99b1ba +0 -0
  170. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.116_2026-08-19-09-30-47_patch_c706fef6-6813-4183-b268-12e7b00d7d0b +0 -0
  171. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.117_2026-08-19-09-39-14_patch_c6b0495f-2f88-4aa8-9ebf-0a235b4c407e +0 -0
  172. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.118_2026-08-19-09-52-00_patch_b395655a-8d78-4344-9266-6901c20f6517 +0 -0
  173. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.119_2026-08-19-10-22-38_patch_8f95c49d-aedc-41b8-816d-ccb95f048831 +0 -0
  174. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.120_2026-08-19-10-26-58_patch_7fbf35e6-cc01-4b75-8c9a-f5d054bcaf93 +0 -0
  175. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.121_2026-08-19-10-42-02_patch_31a81b02-a886-4dea-84e0-67cc6ca412d5 +0 -0
  176. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.122_2026-08-19-11-16-49_patch_1c4d7307-48d4-493e-936d-80af799d644b +0 -0
  177. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.123_2026-08-19-11-47-32_patch_d3d78d04-9989-45b1-91b1-93b571d8814a +0 -0
  178. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.124_2026-08-20-08-03-17_patch_57f4c389-2d19-41ce-aca4-13b61c62f387 +0 -0
  179. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.125_2026-08-20-08-25-05_patch_7f368148-0d1c-4525-bbdf-c6d257ad861a +0 -0
  180. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.126_2026-08-20-14-51-36_patch_a99abcc8-3371-4c63-a759-bb7ea5b32432 +0 -0
  181. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.127_2026-08-21-05-48-58_patch_34b4ccee-7596-4f57-93e9-774973cca58e +0 -0
  182. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.128_2026-08-21-10-47-20_patch_693112b9-927c-4a8f-8553-b06eef86079d +0 -0
  183. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.129_2026-08-21-11-16-54_patch_7a981666-01d9-4d1b-9ba3-2129744e3bd5 +0 -0
  184. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.130_2026-08-21-13-09-36_patch_b7ad1a76-ce70-4d70-9d1a-7c414eba5bb4 +0 -0
  185. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.131_2026-08-21-14-31-10_patch_9128ef66-193e-4caf-8710-afd86128e638 +0 -0
  186. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.132_2026-08-24-08-59-34_patch_c600fc14-86a5-460f-9c4e-f0177056f756 +0 -0
  187. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.133_2026-08-24-10-28-29_patch_b6ce3e32-9d7b-48ac-981a-270c22c180dd +0 -0
  188. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.134_2026-08-24-11-00-51_patch_a4fc0484-4a64-46a2-94f8-aa805254c7b0 +0 -0
  189. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.135_2026-08-24-12-12-41_patch_a870a56f-9a65-49eb-92da-f572b26667d8 +0 -0
  190. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.136_2026-08-24-12-42-46_patch_9b399356-6482-4291-8da7-e748a99c4b53 +0 -0
  191. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.137_2026-08-24-12-53-57_patch_f7979348-1910-40cd-a535-90299eca84ee +0 -0
  192. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.138_2026-08-24-14-36-30_patch_ed0f8750-f663-498b-85e7-0d3f2213fcfe +0 -0
  193. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.139_2026-08-25-08-37-26_patch_3ba87e19-902b-4f76-b64c-90e5c0ca1fc6 +0 -0
  194. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.140_2026-08-25-09-52-45_patch_abc830f2-df15-4385-b797-cdaf72c10752 +0 -0
  195. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.141_2026-08-25-11-37-20_patch_1d9ec01e-06f6-4c8e-b095-af17d5b62b00 +0 -0
  196. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.142_2026-08-26-07-38-49_patch_3dd23e36-e7df-494c-986f-a412861a8d40 +0 -0
  197. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.143_2026-08-26-09-32-32_patch_7b7ebd34-de27-4b73-98a7-3e1501e16cd5 +0 -0
  198. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.144_2026-08-26-10-56-43_patch_166064f2-2208-4c9b-9e25-25dc4cd32084 +0 -0
  199. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.145_2026-08-26-11-37-29_patch_b997f3ee-d7d3-4408-9f2f-c8b6d08bdb3b +0 -0
  200. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.146_2026-08-26-12-15-20_patch_afbbb893-25db-468c-81db-2663ca373068 +0 -0
  201. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.147_2026-08-26-14-10-50_patch_fd753b1f-2fa1-4ddb-a9e7-de690da85254 +0 -0
  202. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.148_2026-08-27-09-08-35_patch_23814c0b-7f77-489c-b4a8-ceadd18146e3 +0 -0
  203. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.149_2026-08-27-09-40-17_patch_8879d72e-a3d8-4abc-a16a-d9dcf75f0fa1 +0 -0
  204. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.150_2026-08-27-10-57-25_patch_afbe60ed-3e23-4d88-be3c-f800d7002a7d +0 -0
  205. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.151_2026-08-28-09-02-46_patch_1d4ca23b-aeae-4ea8-96b1-8cf57371f29d +0 -0
  206. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.152_2026-08-28-15-37-24_patch_c9d0bdc1-a7e1-432b-92b9-92dc76fe0c78 +0 -0
  207. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.153_2026-08-29-09-03-27_patch_7531573a-1b33-4092-aa9c-0e65f47b201f +0 -0
  208. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.154_2026-08-29-11-56-35_patch_919f5787-39c8-4dc1-ae6a-f27c28380f21 +0 -0
  209. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.155_2026-08-29-15-15-59_patch_822f9ed8-c366-4e5f-9791-dee8467cf3ce +0 -0
  210. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.156_2026-08-29-16-19-01_patch_3ac2bf36-20f7-4c9f-9fdb-295d4466d59e +0 -0
  211. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.157_2026-08-30-17-32-17_patch_4302354c-c9c5-4be7-acd3-542872a748d8 +0 -0
  212. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.158_2026-08-31-09-28-33_patch_3523774f-c25d-4102-8c1a-92fff046a48d +0 -0
  213. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.159_2026-08-31-10-31-01_patch_fe3e6290-2553-4154-a0a0-8b8a418280ed +0 -0
  214. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.160_2026-08-31-11-23-39_patch_e701a085-3d23-4212-b0af-73b1d419a4c1 +0 -0
  215. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.161_2026-08-31-12-41-01_patch_074d7bde-c493-44db-bc15-e81fd91e2921 +0 -0
  216. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.162_2026-08-31-13-58-06_patch_84db1d60-4280-433b-bd3a-22e5611cd315 +0 -0
  217. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.163_2026-08-31-15-25-54_patch_1931c5ba-73df-48cb-8dcb-555ace0af267 +0 -0
  218. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.163_2026-08-31-15-44-37_patch_3962e805-2a92-494a-a87b-b6e6d66c40a0 +0 -0
  219. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.165_2026-08-31-19-48-59_patch_86e5b923-2b99-4b86-b542-469b197614be +0 -0
  220. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.166_2026-09-01-07-39-57_patch_c344892f-d542-4e7b-8f27-02365a411e15 +0 -0
  221. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.167_2026-09-01-08-21-53_patch_e199d419-282a-4dbb-8756-cf98b7037e2b +0 -0
  222. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.168_2026-09-01-09-12-31_patch_235c9fe0-da15-431d-bb56-01e2b9b15f4b +0 -0
  223. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.169_2026-09-01-11-54-19_patch_98b617ab-d130-42b5-93f2-19cae56d4c4c +0 -0
  224. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.170_2026-09-02-09-27-28_patch_e448d2e6-b7ec-4235-96bf-0173b3623c87 +0 -0
  225. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.171_2026-09-02-12-52-44_patch_e6a241c2-1d62-482c-a9eb-9e3373395c50 +0 -0
  226. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.172_2026-09-04-08-47-04_patch_daae079f-c104-4fcd-bb57-7bff68e80ad9 +0 -0
  227. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.173_2026-09-04-12-34-42_patch_399c4cbd-0c28-4dfd-a4ec-e569420a36e4 +0 -0
  228. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.174_2026-09-04-13-08-48_patch_f5cfe3d5-808e-45e4-bafc-00d0554838ee +0 -0
  229. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.175_2026-09-04-17-20-46_patch_1ef542fa-5d8e-4d90-aa15-9fc4cea3dfec +0 -0
  230. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.176_2026-09-05-08-25-05_patch_ced5521f-f9da-4640-a921-95fcb5cd2e6d +0 -0
  231. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.177_2026-09-05-09-00-16_patch_803c1ad4-a9af-4953-92c5-d882dec03ea2 +0 -0
  232. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.178_2026-09-05-09-30-34_patch_012f6259-2e3f-4591-9806-1920fd06cb1f +0 -0
  233. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.179_2026-09-05-09-33-43_patch_f4bdf28c-d584-47a5-b699-8c883330162c +0 -0
  234. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.180_2026-09-05-12-02-21_patch_34a14b01-d22d-44a8-ac63-be0370a61422 +0 -0
  235. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.181_2026-09-05-12-47-46_patch_56b18867-99f6-4d5c-8215-7b9d60d34010 +0 -0
  236. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.182_2026-09-05-13-35-18_patch_61b7d4d1-73c8-4603-9b0c-593e7405587f +0 -0
  237. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.183_2026-09-06-07-27-09_patch_d76331b2-e3a3-4c0b-8412-ecd131b6ac02 +0 -0
  238. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.184_2026-09-06-10-21-47_patch_7680b7a1-49f0-4eef-b12e-4c854407448c +0 -0
  239. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.185_2026-09-06-10-30-40_patch_e56c2183-77f8-44ef-a92e-7377ea6ce8c1 +0 -0
  240. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.186_2026-09-07-10-00-51_patch_67de5683-d208-4bc0-8fb6-7677377908e7 +0 -0
  241. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.187_2026-09-07-10-18-13_patch_2086cee2-276b-48f7-80ce-6a17397b9541 +0 -0
  242. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.188_2026-09-07-12-51-28_patch_d6590822-068f-4a19-814d-34bbf204ba6e +0 -0
  243. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.189_2026-09-07-12-55-23_patch_7e0fb04b-4d40-4490-974f-c74ba2ae55a1 +0 -0
  244. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.190_2026-09-08-08-58-03_patch_15e3ac1e-4475-4272-bdd8-d00bb0db8f17 +0 -0
  245. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.191_2026-09-08-09-55-58_patch_3d350e50-ee53-4282-bc75-d2251142c46e +0 -0
  246. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.192_2026-09-08-11-12-21_patch_0733223b-1ae2-4b5b-897f-dfc57574ff83 +0 -0
  247. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.193_2026-09-08-21-48-17_patch_8d07d4e6-3555-4720-85c9-9452570fae2d +0 -0
  248. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.194_2026-09-09-07-53-43_patch_69559429-aa42-4b62-9bd7-cdfded1c00d0 +0 -0
  249. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.195_2026-09-09-09-55-40_patch_bbf67f1d-3b9a-43a2-b1bc-22df3fed8a34 +0 -0
  250. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.196_2026-09-09-09-59-47_patch_70d76812-7b3c-4192-ad49-fcaccc29b0da +0 -0
  251. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.197_2026-09-09-13-06-06_patch_d455be0b-5421-492a-b952-fab0fd8110f8 +0 -0
  252. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.198_2026-09-09-13-14-34_patch_267f54e5-311e-435e-882f-8e19191325ea +0 -0
  253. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.199_2026-09-09-22-24-18_patch_81e3e453-ca0e-42fa-9c21-8f94d43c05f2 +0 -0
  254. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.200_2026-09-10-07-19-50_patch_911714fa-1fa3-4165-bfe6-d10c650bf5bf +0 -0
  255. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.201_2026-09-10-10-14-19_patch_864015f2-b0b0-4563-a1c8-155629cb9126 +0 -0
  256. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.202_2026-09-10-11-00-05_patch_18270ecf-e770-4e69-8bcf-e5143c39929b +0 -0
  257. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.203_2026-09-10-11-10-41_patch_ff273ab1-44f3-4bc0-b184-3396e943df04 +0 -0
  258. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.204_2026-09-10-13-02-02_patch_d4ee41e2-d13c-4941-8605-3f1a42b56b22 +0 -0
  259. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.205_2026-09-10-13-57-50_patch_284df67e-5957-4b0c-bc64-5581db6ddecc +0 -0
  260. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.206_2026-09-11-10-18-50_patch_1ac7e410-0e62-4eef-bbe4-ebf93c9d0869 +0 -0
  261. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/17.0.207_2026-09-11-15-26-02_major_3f1b3ed7-eaac-41f5-b740-0af3331595d9 +0 -0
  262. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/18.0.0_2026-09-12-10-01-10_patch_8995783a-a9fa-4c4e-90b3-6386a4c481eb +0 -0
  263. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/18.0.1_2026-09-12-17-33-30_patch_f6ea2c99-a715-4c4d-876a-23ed8c62a83d +0 -0
  264. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/__init__.py +0 -0
  265. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli/version/read_version.py +0 -0
  266. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli.egg-info/dependency_links.txt +0 -0
  267. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli.egg-info/entry_points.txt +0 -0
  268. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli.egg-info/not-zip-safe +0 -0
  269. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli.egg-info/requires.txt +0 -0
  270. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/ellf_cli.egg-info/top_level.txt +0 -0
  271. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/pyproject.toml +0 -0
  272. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/setup.cfg +0 -0
  273. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/setup.py +0 -0
  274. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_appdirs.py +0 -0
  275. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_auth.py +0 -0
  276. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_config.py +0 -0
  277. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_errors.py +0 -0
  278. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_files_cp.py +0 -0
  279. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_files_cp_helpers.py +0 -0
  280. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_helm.py +0 -0
  281. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_import_export.py +0 -0
  282. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_info.py +0 -0
  283. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_infra_config_io.py +0 -0
  284. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_infra_configure.py +0 -0
  285. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_infra_deploy_node_labels.py +0 -0
  286. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_infra_get_terraform.py +0 -0
  287. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_infra_init.py +0 -0
  288. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_infra_provision.py +0 -0
  289. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_infra_start_fixes.py +0 -0
  290. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_infra_start_validation.py +0 -0
  291. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_infra_state_bucket.py +0 -0
  292. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_infra_terraform_init.py +0 -0
  293. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_invalid_secrets.py +0 -0
  294. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_job_list_project_filter.py +0 -0
  295. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_jobs_list_unmatched.py +0 -0
  296. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_key_pair.py +0 -0
  297. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_login.py +0 -0
  298. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_logout.py +0 -0
  299. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_main.py +0 -0
  300. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_org_select.py +0 -0
  301. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_plans.py +0 -0
  302. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_projects.py +0 -0
  303. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_publish_build_poll.py +0 -0
  304. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_publish_data.py +0 -0
  305. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_publish_import_root.py +0 -0
  306. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_publish_requirements.py +0 -0
  307. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_pypi_auth.py +0 -0
  308. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_query.py +0 -0
  309. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_recipe_file.py +0 -0
  310. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_recipes.py +0 -0
  311. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_state.py +0 -0
  312. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_support.py +0 -0
  313. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_todos.py +0 -0
  314. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_ty.py +0 -0
  315. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_ui.py +0 -0
  316. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_ui_extras.py +0 -0
  317. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_usage_counts.py +0 -0
  318. {ellf_cli-18.0.2 → ellf_cli-18.0.5}/tests/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 18.0.2
3
+ Version: 18.0.5
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
@@ -215,7 +215,7 @@ List the agents in a project. Uses your default project unless --project is give
215
215
  | Argument | Type | Description | Default |
216
216
  | --- | --- | --- | --- |
217
217
  | `--project` | `str` | Name, slug, or ID of agent's project or the last project if not set | `None` |
218
- | `--select` | `list[str]` | Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'cluster_id', 'name', 'project_id', 'job_type', 'plan', 'cli_command', 'last_execution_started', 'state'] | `['id', 'name', 'state']` |
218
+ | `--select` | `list[str]` | Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'cluster_id', 'name', 'project_id', 'job_type', 'plan', 'cli_command', 'last_execution_started', 'icon', 'state'] | `['id', 'name', 'state']` |
219
219
  | `--json` | `bool` | Output the result as JSON | `False` |
220
220
 
221
221
  #### `ellf agents info`
@@ -227,7 +227,7 @@ Print information about an agent on the cluster
227
227
  | `name_or_id` | `Union[str, UUID]` | Name or ID of the agent | |
228
228
  | `--project` | `str` | Name, slug, or ID of agent's project or the last project if not set | `None` |
229
229
  | `--cluster` | `str` | Name, slug, or ID of the cluster to search for agent name (or the last cluster if not set) | `None` |
230
- | `--select` | `list[str]` | Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'cluster_id', 'name', 'project_id', 'job_type', 'plan', 'cli_command', 'last_execution_started', 'recipe_name', 'recipe_title', 'project_name', 'error', 'last_execution_id', 'related_tasks', 'created_by_user'] | `None` |
230
+ | `--select` | `list[str]` | Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'cluster_id', 'name', 'project_id', 'job_type', 'plan', 'cli_command', 'last_execution_started', 'icon', 'recipe_name', 'recipe_title', 'project_name', 'error', 'last_execution_id', 'related_tasks', 'created_by_user'] | `None` |
231
231
  | `--json` | `bool` | Output the result as JSON | `False` |
232
232
 
233
233
  #### `ellf agents logs`
@@ -1431,7 +1431,7 @@ List all users in the organization
1431
1431
 
1432
1432
  | Argument | Type | Description | Default |
1433
1433
  | --- | --- | --- | --- |
1434
- | `--select` | `list[str]` | Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'name', 'org_id', 'org_name', 'person_id', 'email', 'avatar_url', 'locale', 'is_org_admin', 'is_org_developer', 'last_cluster_id', 'last_project_id', 'deactivated_at', 'role'] | `['id', 'name', 'email', 'role']` |
1434
+ | `--select` | `list[str]` | Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'name', 'org_id', 'org_name', 'person_id', 'email', 'avatar_url', 'locale', 'is_org_admin', 'is_org_developer', 'last_cluster_id', 'last_project_id', 'deactivated_at', 'role', 'status'] | `['id', 'name', 'email', 'role']` |
1435
1435
  | `--role` | `str` | Filter by role | `None` |
1436
1436
  | `--include-deactivated` | `bool` | Include deactivated users | `False` |
1437
1437
  | `--json` | `bool` | Output the result as JSON | `False` |
@@ -1505,7 +1505,7 @@ List pending invitations
1505
1505
 
1506
1506
  | Argument | Type | Description | Default |
1507
1507
  | --- | --- | --- | --- |
1508
- | `--select` | `list[str]` | Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'email', 'claimed', 'vars', 'role'] | `['id', 'email', 'role', 'claimed']` |
1508
+ | `--select` | `list[str]` | Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'email', 'claimed', 'vars', 'created_by_id', 'role'] | `['id', 'email', 'role', 'claimed']` |
1509
1509
  | `--all` | `bool` | Also include invitations that have already been claimed | `False` |
1510
1510
  | `--json` | `bool` | Output the result as JSON | `False` |
1511
1511
 
@@ -10,6 +10,7 @@ from wasabi import msg
10
10
  from ellf_pam_sdk import Client as PamClient
11
11
  from ellf_pam_sdk.errors import EllfError
12
12
  from ellf_pam_sdk.models import (
13
+ AnnotatorType,
13
14
  InvitationDetail,
14
15
  InvitationReading,
15
16
  InvitationSummary,
@@ -34,6 +35,16 @@ from ._state import get_auth_state
34
35
  UserRoleName = Literal["admin", "developer", "annotator"]
35
36
 
36
37
 
38
+ # What `users list` shows when nothing is asked for. Named because the command
39
+ # adds to it when deactivated users are in the table, and can only tell that
40
+ # the caller wants the default by comparing against it.
41
+ DEFAULT_SELECT = ["id", "name", "email", "role"]
42
+
43
+
44
+ def _status_of(user: Union[UserSummary, UserDetail]) -> str:
45
+ return "deactivated" if user.deactivated_at else "active"
46
+
47
+
37
48
  def _role_of(user: Union[UserSummary, UserDetail]) -> str:
38
49
  if user.is_org_admin:
39
50
  return "admin"
@@ -104,7 +115,7 @@ def _is_assigned(client: PamClient, task_id: UUID, user_id: UUID) -> bool:
104
115
  so ``is_added`` on a user row is what actually answers this.
105
116
  """
106
117
  return any(
107
- a.id == user_id and a.is_added and a.annotator_type != "agent"
118
+ a.id == user_id and a.is_added and a.annotator_type != AnnotatorType.agent
108
119
  for a in client.task.users(task_id)
109
120
  )
110
121
 
@@ -116,7 +127,7 @@ def _is_assigned(client: PamClient, task_id: UUID, user_id: UUID) -> bool:
116
127
  select=Arg(
117
128
  "--select",
118
129
  help=Messages.select.format(
119
- opts=builtins.list(UserSummary.model_fields) + ["role"]
130
+ opts=builtins.list(UserSummary.model_fields) + ["role", "status"]
120
131
  ),
121
132
  ),
122
133
  role=Arg("--role", help=Messages.filter_by.format(filter="role")),
@@ -127,7 +138,7 @@ def _is_assigned(client: PamClient, task_id: UUID, user_id: UUID) -> bool:
127
138
  # fmt: on
128
139
  )
129
140
  def list(
130
- select: builtins.list[str] = ["id", "name", "email", "role"],
141
+ select: builtins.list[str] = DEFAULT_SELECT,
131
142
  role: Optional[UserRoleName] = None,
132
143
  include_deactivated: bool = False,
133
144
  as_json: bool = False,
@@ -137,7 +148,14 @@ def list(
137
148
  query = _role_query(role) if role is not None else UserReading()
138
149
  query.include_deactivated = include_deactivated
139
150
  items = builtins.list(client.user.all(query))
140
- rows = [{**u.model_dump(), "role": _role_of(u)} for u in items]
151
+ rows = [
152
+ {**u.model_dump(), "role": _role_of(u), "status": _status_of(u)} for u in items
153
+ ]
154
+ # The status column earns its place only where the table can hold both
155
+ # kinds: without the flag every row reads "active", which is a column
156
+ # saying nothing. A caller who named their own columns keeps them.
157
+ if include_deactivated and select == DEFAULT_SELECT:
158
+ select = [*select, "status"]
141
159
  print_table_with_select(rows, select=select, as_json=as_json)
142
160
  return items
143
161
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "prog": "ellf",
3
3
  "help": "Ellf Command Line Interface.",
4
- "version": "18.0.1",
4
+ "version": "18.0.4",
5
5
  "extra_key": "_extra",
6
6
  "commands": {
7
7
  "actions": {
@@ -1255,9 +1255,9 @@
1255
1255
  "id": "select",
1256
1256
  "option": "--select",
1257
1257
  "short": null,
1258
- "orig_help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'cluster_id', 'name', 'project_id', 'job_type', 'plan', 'cli_command', 'last_execution_started', 'state']",
1258
+ "orig_help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'cluster_id', 'name', 'project_id', 'job_type', 'plan', 'cli_command', 'last_execution_started', 'icon', 'state']",
1259
1259
  "default": "['id', 'name', 'state']",
1260
- "help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'cluster_id', 'name', 'project_id', 'job_type', 'plan', 'cli_command', 'last_execution_started', 'state'] (list[str])",
1260
+ "help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'cluster_id', 'name', 'project_id', 'job_type', 'plan', 'cli_command', 'last_execution_started', 'icon', 'state'] (list[str])",
1261
1261
  "action": null,
1262
1262
  "choices": null,
1263
1263
  "has_converter": true,
@@ -1329,9 +1329,9 @@
1329
1329
  "id": "select",
1330
1330
  "option": "--select",
1331
1331
  "short": null,
1332
- "orig_help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'cluster_id', 'name', 'project_id', 'job_type', 'plan', 'cli_command', 'last_execution_started', 'recipe_name', 'recipe_title', 'project_name', 'error', 'last_execution_id', 'related_tasks', 'created_by_user']",
1332
+ "orig_help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'cluster_id', 'name', 'project_id', 'job_type', 'plan', 'cli_command', 'last_execution_started', 'icon', 'recipe_name', 'recipe_title', 'project_name', 'error', 'last_execution_id', 'related_tasks', 'created_by_user']",
1333
1333
  "default": null,
1334
- "help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'cluster_id', 'name', 'project_id', 'job_type', 'plan', 'cli_command', 'last_execution_started', 'recipe_name', 'recipe_title', 'project_name', 'error', 'last_execution_id', 'related_tasks', 'created_by_user'] (list[str])",
1334
+ "help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'cluster_id', 'name', 'project_id', 'job_type', 'plan', 'cli_command', 'last_execution_started', 'icon', 'recipe_name', 'recipe_title', 'project_name', 'error', 'last_execution_id', 'related_tasks', 'created_by_user'] (list[str])",
1335
1335
  "action": null,
1336
1336
  "choices": null,
1337
1337
  "has_converter": true,
@@ -8401,9 +8401,9 @@
8401
8401
  "id": "select",
8402
8402
  "option": "--select",
8403
8403
  "short": null,
8404
- "orig_help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'name', 'org_id', 'org_name', 'person_id', 'email', 'avatar_url', 'locale', 'is_org_admin', 'is_org_developer', 'last_cluster_id', 'last_project_id', 'deactivated_at', 'role']",
8404
+ "orig_help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'name', 'org_id', 'org_name', 'person_id', 'email', 'avatar_url', 'locale', 'is_org_admin', 'is_org_developer', 'last_cluster_id', 'last_project_id', 'deactivated_at', 'role', 'status']",
8405
8405
  "default": "['id', 'name', 'email', 'role']",
8406
- "help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'name', 'org_id', 'org_name', 'person_id', 'email', 'avatar_url', 'locale', 'is_org_admin', 'is_org_developer', 'last_cluster_id', 'last_project_id', 'deactivated_at', 'role'] (list[str])",
8406
+ "help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'name', 'org_id', 'org_name', 'person_id', 'email', 'avatar_url', 'locale', 'is_org_admin', 'is_org_developer', 'last_cluster_id', 'last_project_id', 'deactivated_at', 'role', 'status'] (list[str])",
8407
8407
  "action": null,
8408
8408
  "choices": null,
8409
8409
  "has_converter": true,
@@ -8801,9 +8801,9 @@
8801
8801
  "id": "select",
8802
8802
  "option": "--select",
8803
8803
  "short": null,
8804
- "orig_help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'email', 'claimed', 'vars', 'role']",
8804
+ "orig_help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'email', 'claimed', 'vars', 'created_by_id', 'role']",
8805
8805
  "default": "['id', 'email', 'role', 'claimed']",
8806
- "help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'email', 'claimed', 'vars', 'role'] (list[str])",
8806
+ "help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'email', 'claimed', 'vars', 'created_by_id', 'role'] (list[str])",
8807
8807
  "action": null,
8808
8808
  "choices": null,
8809
8809
  "has_converter": true,
@@ -30,6 +30,7 @@
30
30
  #
31
31
 
32
32
  from ellf_recipes_sdk import (
33
+ AgentIcon,
33
34
  Annotator,
34
35
  FloatProps,
35
36
  Secret,
@@ -38,6 +39,7 @@ from ellf_recipes_sdk import (
38
39
  detect_task_type,
39
40
  format_prompt,
40
41
  parse_response,
42
+ props,
41
43
  )
42
44
 
43
45
 
@@ -65,7 +67,10 @@ def create_llm_client(api_key: str, model_name: str):
65
67
  # takes (task, config) and returns an annotated task dict.
66
68
  #
67
69
  # The SDK reads poll_interval and idle_shutdown_seconds from the recipe
68
- # parameters automatically — you don't need to handle them yourself.
70
+ # parameters automatically — you don't need to handle them yourself. The
71
+ # same goes for icon: this is the avatar used in the app wherever the agent's
72
+ # annotations are attributed to it. Pick the default that suits your agent — the
73
+ # model provider it calls, or what it does — from the set in props.icon.
69
74
  #
70
75
  # Agents are created and managed like tasks and actions:
71
76
  # ellf agents create <recipe> --name "My Agent" --api-key MY_SECRET ...
@@ -96,6 +101,7 @@ def create_llm_client(api_key: str, model_name: str):
96
101
  description="Shut down after this many seconds without tasks (0 = keep running)",
97
102
  min=0.0,
98
103
  ),
104
+ "icon": props.icon,
99
105
  },
100
106
  )
101
107
  def my_agent(
@@ -104,6 +110,7 @@ def my_agent(
104
110
  model_name: str = "gpt-4o",
105
111
  poll_interval: float = 1.0,
106
112
  idle_shutdown_seconds: float = 0.0,
113
+ icon: AgentIcon = "bot",
107
114
  ) -> Annotator:
108
115
  """A template for Ellf agent recipes.
109
116
 
@@ -0,0 +1,3 @@
1
+ 18.0.2
2
+ patch
3
+ 176bb944-1c49-4dd3-a001-8fce908825a0
@@ -0,0 +1,3 @@
1
+ 18.0.3
2
+ patch
3
+ 58e5ce3a-f2a7-4789-b2cd-5cc75c72b6ec
@@ -0,0 +1,3 @@
1
+ 18.0.4
2
+ patch
3
+ b6c79d55-8f85-4f47-a304-df52b122c38c
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 18.0.2
3
+ Version: 18.0.5
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
@@ -263,6 +263,9 @@ ellf_cli/version/17.0.206_2026-09-11-10-18-50_patch_1ac7e410-0e62-4eef-bbe4-ebf9
263
263
  ellf_cli/version/17.0.207_2026-09-11-15-26-02_major_3f1b3ed7-eaac-41f5-b740-0af3331595d9
264
264
  ellf_cli/version/18.0.0_2026-09-12-10-01-10_patch_8995783a-a9fa-4c4e-90b3-6386a4c481eb
265
265
  ellf_cli/version/18.0.1_2026-09-12-17-33-30_patch_f6ea2c99-a715-4c4d-876a-23ed8c62a83d
266
+ ellf_cli/version/18.0.2_2026-09-13-06-36-33_patch_176bb944-1c49-4dd3-a001-8fce908825a0
267
+ ellf_cli/version/18.0.3_2026-09-13-12-32-46_patch_58e5ce3a-f2a7-4789-b2cd-5cc75c72b6ec
268
+ ellf_cli/version/18.0.4_2026-09-13-12-45-14_patch_b6c79d55-8f85-4f47-a304-df52b122c38c
266
269
  ellf_cli/version/__init__.py
267
270
  ellf_cli/version/read_version.py
268
271
  tests/test_appdirs.py
@@ -310,4 +313,5 @@ tests/test_ui.py
310
313
  tests/test_ui_extras.py
311
314
  tests/test_usage_counts.py
312
315
  tests/test_users_assign.py
316
+ tests/test_users_list.py
313
317
  tests/test_util.py
@@ -8,7 +8,12 @@ import pytest
8
8
 
9
9
  from ellf_cli.commands import users as users_cmd
10
10
  from ellf_cli.errors import CLIError
11
- from ellf_pam_sdk.models import EmailReturning, TaskAnnotator, UserDetail
11
+ from ellf_pam_sdk.models import (
12
+ AnnotatorType,
13
+ EmailReturning,
14
+ TaskAnnotator,
15
+ UserDetail,
16
+ )
12
17
 
13
18
 
14
19
  def _user(*, admin: bool = False, developer: bool = False) -> UserDetail:
@@ -35,7 +40,7 @@ def _annotator(
35
40
  user_id: UUID,
36
41
  *,
37
42
  is_added: bool = True,
38
- annotator_type: str = "user",
43
+ annotator_type: AnnotatorType = AnnotatorType.user,
39
44
  ) -> TaskAnnotator:
40
45
  return TaskAnnotator(
41
46
  id=user_id,
@@ -205,7 +210,9 @@ def test_unassign_does_not_match_an_agent_row(env):
205
210
  `ellf agents unassign`, so a same-id agent row must not stand in for a
206
211
  user assignment."""
207
212
  user = _user()
208
- task_client, _ = env(user, [_annotator(user.id, annotator_type="agent")])
213
+ task_client, _ = env(
214
+ user, [_annotator(user.id, annotator_type=AnnotatorType.agent)]
215
+ )
209
216
 
210
217
  with pytest.raises(CLIError):
211
218
  users_cmd.unassign(user.email, task="ner-task")
@@ -0,0 +1,77 @@
1
+ from datetime import datetime, timezone
2
+ from types import SimpleNamespace
3
+ from typing import Any
4
+ from uuid import uuid4
5
+
6
+ import pytest
7
+
8
+ from ellf_cli.commands import users as users_cmd
9
+ from ellf_pam_sdk.models import UserSummary
10
+
11
+
12
+ def _user(name: str, *, deactivated: bool = False) -> UserSummary:
13
+ now = datetime.now(timezone.utc)
14
+ return UserSummary(
15
+ id=uuid4(),
16
+ created=now,
17
+ updated=now,
18
+ name=name,
19
+ org_id=uuid4(),
20
+ org_name="Explosion",
21
+ person_id=uuid4(),
22
+ email=f"{name.lower()}@example.com",
23
+ avatar_url="",
24
+ locale="en",
25
+ is_org_admin=False,
26
+ is_org_developer=False,
27
+ deactivated_at=now if deactivated else None,
28
+ )
29
+
30
+
31
+ @pytest.fixture
32
+ def listed(monkeypatch):
33
+ """Run `users list` against a fixed set of people, and capture the table."""
34
+ printed: dict[str, Any] = {}
35
+
36
+ def _run(users: list[UserSummary], **kwargs: Any) -> dict[str, Any]:
37
+ auth = SimpleNamespace(
38
+ client=SimpleNamespace(user=SimpleNamespace(all=lambda _query: users))
39
+ )
40
+ monkeypatch.setattr(users_cmd, "get_auth_state", lambda: auth)
41
+ monkeypatch.setattr(
42
+ users_cmd,
43
+ "print_table_with_select",
44
+ lambda rows, select, as_json: printed.update(rows=rows, select=select),
45
+ )
46
+ users_cmd.list(**kwargs)
47
+ return printed
48
+
49
+ return _run
50
+
51
+
52
+ def test_listing_deactivated_users_says_which_they_are(listed):
53
+ """Both kinds are in the table, so a column has to tell them apart."""
54
+ printed = listed(
55
+ [_user("Ann"), _user("Bo", deactivated=True)], include_deactivated=True
56
+ )
57
+
58
+ assert printed["select"] == ["id", "name", "email", "role", "status"]
59
+ assert [row["status"] for row in printed["rows"]] == ["active", "deactivated"]
60
+
61
+
62
+ def test_the_default_listing_spends_no_column_on_status(listed):
63
+ """Without the flag every row is active, and the column says nothing."""
64
+ printed = listed([_user("Ann")])
65
+
66
+ assert printed["select"] == ["id", "name", "email", "role"]
67
+
68
+
69
+ def test_chosen_columns_are_left_alone(listed):
70
+ """Asking for columns is asking for those columns."""
71
+ printed = listed(
72
+ [_user("Ann", deactivated=True)],
73
+ include_deactivated=True,
74
+ select=["name", "email"],
75
+ )
76
+
77
+ assert printed["select"] == ["name", "email"]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes