ellf-cli 4.0.146__tar.gz → 4.0.151__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-4.0.146/ellf_cli.egg-info → ellf_cli-4.0.151}/PKG-INFO +1 -1
  2. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/about.json +1 -1
  3. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf.json +26 -26
  4. ellf_cli-4.0.151/ellf_cli/ellf_skills/bin/write-current-session.py +71 -0
  5. ellf_cli-4.0.151/ellf_cli/ellf_skills/hooks/hooks.json +37 -0
  6. ellf_cli-4.0.151/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/SKILL.md +168 -0
  7. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/SKILL.md +0 -8
  8. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-handoff/SKILL.md +1 -3
  9. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/SKILL.md +22 -40
  10. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/references/training_monitoring.md +1 -1
  11. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/SKILL.md +2 -26
  12. {ellf_cli-4.0.146/ellf_cli/ellf_skills/skills/ellf-monitor.assistant → ellf_cli-4.0.151/ellf_cli/ellf_skills/skills/ellf-monitor.coding}/references/annotation_metrics.md +4 -7
  13. ellf_cli-4.0.151/ellf_cli/ellf_skills/skills/ellf-ops.assistant/SKILL.md +210 -0
  14. ellf_cli-4.0.151/ellf_cli/ellf_skills/skills/ellf-ops.coding/SKILL.md +321 -0
  15. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-patterns/references/pattern_strategies.md +1 -3
  16. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-project.assistant/SKILL.md +20 -42
  17. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-project.coding/SKILL.md +21 -43
  18. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-support.assistant/SKILL.md +4 -5
  19. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-support.coding/SKILL.md +12 -13
  20. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-todo/SKILL.md +2 -2
  21. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.assistant/SKILL.md +7 -7
  22. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/workflow.md +15 -17
  23. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.coding/SKILL.md +1 -1
  24. {ellf_cli-4.0.146 → ellf_cli-4.0.151/ellf_cli.egg-info}/PKG-INFO +1 -1
  25. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli.egg-info/SOURCES.txt +2 -1
  26. ellf_cli-4.0.146/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/SKILL.md +0 -169
  27. ellf_cli-4.0.146/ellf_cli/ellf_skills/skills/ellf-ops.assistant/SKILL.md +0 -382
  28. ellf_cli-4.0.146/ellf_cli/ellf_skills/skills/ellf-ops.coding/SKILL.md +0 -161
  29. ellf_cli-4.0.146/ellf_cli/ellf_skills/skills/ellf-ops.coding/references/data_infra_cli.md +0 -156
  30. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/LICENSE +0 -0
  31. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/MANIFEST.in +0 -0
  32. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/README.md +0 -0
  33. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/__init__.py +0 -0
  34. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/__main__.py +0 -0
  35. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/about.py +0 -0
  36. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/appdirs.py +0 -0
  37. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/auth.py +0 -0
  38. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/cli.py +0 -0
  39. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/cloud/__init__.py +0 -0
  40. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/cloud/gcp.py +0 -0
  41. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/cluster_config.py +0 -0
  42. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/__init__.py +0 -0
  43. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/_recipe_file.py +0 -0
  44. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/_recipe_subcommand.py +0 -0
  45. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/_state.py +0 -0
  46. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/actions.py +0 -0
  47. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/agents.py +0 -0
  48. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/assets.py +0 -0
  49. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/auth.py +0 -0
  50. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/clusters.py +0 -0
  51. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/config.py +0 -0
  52. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/datasets.py +0 -0
  53. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/files/__init__.py +0 -0
  54. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/files/cp.py +0 -0
  55. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/files/ls.py +0 -0
  56. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/files/rm.py +0 -0
  57. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/files/rsync.py +0 -0
  58. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/files/stats.py +0 -0
  59. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/general.py +0 -0
  60. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/import_export.py +0 -0
  61. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/infra/__init__.py +0 -0
  62. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/infra/_helpers.py +0 -0
  63. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/infra/deploy.py +0 -0
  64. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/infra/init_values.py +0 -0
  65. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/infra/provision.py +0 -0
  66. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/infra/register.py +0 -0
  67. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/infra/setup.py +0 -0
  68. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/infra/start.py +0 -0
  69. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/infra/terraform.py +0 -0
  70. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/infra/tls.py +0 -0
  71. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/jobs.py +0 -0
  72. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/packages.py +0 -0
  73. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/paths.py +0 -0
  74. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/plans.py +0 -0
  75. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/projects.py +0 -0
  76. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/publish_code.py +0 -0
  77. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/publish_data.py +0 -0
  78. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/recipes.py +0 -0
  79. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/secrets.py +0 -0
  80. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/support.py +0 -0
  81. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/tasks.py +0 -0
  82. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/commands/todos.py +0 -0
  83. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/config.py +0 -0
  84. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/.claude-plugin/plugin.json +0 -0
  85. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/.gitignore +0 -0
  86. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skill_variants.json +0 -0
  87. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/references/annotation_audit.md +0 -0
  88. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/references/builtin_ellf_annotation_recipes.md +0 -0
  89. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/annotation_audit.md +0 -0
  90. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/builtin_ellf_annotation_recipes.md +0 -0
  91. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/builtin_prodigy_recipes.md +0 -0
  92. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-ask/SKILL.md +0 -0
  93. {ellf_cli-4.0.146/ellf_cli/ellf_skills/skills/ellf-monitor.coding → ellf_cli-4.0.151/ellf_cli/ellf_skills/skills/ellf-monitor.assistant}/references/annotation_metrics.md +0 -0
  94. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/references/training_monitoring.md +0 -0
  95. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/scripts/check_training.py +0 -0
  96. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-ops.coding/scripts/run_job.py +0 -0
  97. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-patterns/SKILL.md +0 -0
  98. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/SKILL.md +0 -0
  99. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_action_recipe.py +0 -0
  100. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_agent_recipe.py +0 -0
  101. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_blocks_ui.py +0 -0
  102. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_correct.py +0 -0
  103. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_custom_ui.py +0 -0
  104. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_manual.py +0 -0
  105. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_pages_ui.py +0 -0
  106. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_routing.py +0 -0
  107. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_task_recipe.py +0 -0
  108. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_teach.py +0 -0
  109. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/builtin_recipes.md +0 -0
  110. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/ellf_recipe_sdk.md +0 -0
  111. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/lint_recipe.py +0 -0
  112. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/prodigy_recipe_api.md +0 -0
  113. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/template_index.md +0 -0
  114. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/consulting_patterns.md +0 -0
  115. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/explosion_strategy.md +0 -0
  116. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/prodigy_llm_bot.md +0 -0
  117. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/consulting_patterns.md +0 -0
  118. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/explosion_strategy.md +0 -0
  119. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/prodigy_llm_bot.md +0 -0
  120. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/diagnostics.md +0 -0
  121. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/evaluation_guide.md +0 -0
  122. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/model_selection.md +0 -0
  123. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/training_paradigms.md +0 -0
  124. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_advanced.md +0 -0
  125. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_architectures.md +0 -0
  126. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_training.md +0 -0
  127. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/diagnostics.md +0 -0
  128. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/evaluation_guide.md +0 -0
  129. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/experiment_patterns.md +0 -0
  130. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/model_selection.md +0 -0
  131. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/training_paradigms.md +0 -0
  132. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/training_troubleshooting.md +0 -0
  133. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/workflow.md +0 -0
  134. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ellf_skills/skills/ellf-train.coding/scripts/ellf_logger.py +0 -0
  135. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/errors.py +0 -0
  136. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/helm.py +0 -0
  137. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/key_pair.py +0 -0
  138. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/main.py +0 -0
  139. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/messages.py +0 -0
  140. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/query.py +0 -0
  141. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/recipes_cookiecutter/cookiecutter.json +0 -0
  142. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/.gitignore +0 -0
  143. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/README.md.tmpl +0 -0
  144. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements-dev.in +0 -0
  145. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements.in +0 -0
  146. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/setup.py.tmpl +0 -0
  147. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/__init__.py +0 -0
  148. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/about.py +0 -0
  149. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/__init__.py +0 -0
  150. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/example_task.py +0 -0
  151. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/testing/__init__.py +0 -0
  152. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ty.py +0 -0
  153. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/ui.py +0 -0
  154. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/url.py +0 -0
  155. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli/util.py +0 -0
  156. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli.egg-info/dependency_links.txt +0 -0
  157. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli.egg-info/entry_points.txt +0 -0
  158. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli.egg-info/not-zip-safe +0 -0
  159. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli.egg-info/requires.txt +0 -0
  160. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/ellf_cli.egg-info/top_level.txt +0 -0
  161. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/pyproject.toml +0 -0
  162. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/setup.cfg +0 -0
  163. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/setup.py +0 -0
  164. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_appdirs.py +0 -0
  165. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_auth.py +0 -0
  166. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_config.py +0 -0
  167. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_errors.py +0 -0
  168. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_files_cp.py +0 -0
  169. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_files_cp_helpers.py +0 -0
  170. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_info.py +0 -0
  171. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_invalid_secrets.py +0 -0
  172. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_key_pair.py +0 -0
  173. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_login.py +0 -0
  174. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_main.py +0 -0
  175. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_plans.py +0 -0
  176. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_projects.py +0 -0
  177. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_query.py +0 -0
  178. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_recipe_file.py +0 -0
  179. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_recipes.py +0 -0
  180. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_state.py +0 -0
  181. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_support.py +0 -0
  182. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_ty.py +0 -0
  183. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_ui.py +0 -0
  184. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_ui_extras.py +0 -0
  185. {ellf_cli-4.0.146 → ellf_cli-4.0.151}/tests/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 4.0.146
3
+ Version: 4.0.151
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": "4.0.146",
4
+ "version": "4.0.151",
5
5
  "summary": "Ellf Command Line Interface",
6
6
  "uri": "https://prodi.gy",
7
7
  "prog": "ellf",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "prog": "ellf",
3
3
  "help": "Ellf Command Line Interface.",
4
- "version": "4.0.145",
4
+ "version": "4.0.150",
5
5
  "extra_key": "_extra",
6
6
  "commands": {
7
7
  "actions": {
@@ -204,7 +204,7 @@
204
204
  "orig_type": "bool"
205
205
  }
206
206
  ],
207
- "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 ",
207
+ "description": "\nLog in to your Ellf account. You normally don't need to call this\nmanually. It will automatically authenticate when needed.\n",
208
208
  "allow_extra": false,
209
209
  "parent": null,
210
210
  "is_placeholder": false
@@ -257,7 +257,7 @@
257
257
  "orig_type": "Literal[api, cluster, id, ci]"
258
258
  }
259
259
  ],
260
- "description": "\n Return an auth token for the current user\n ",
260
+ "description": "\nReturn an auth token for the current user\n",
261
261
  "allow_extra": false,
262
262
  "parent": null,
263
263
  "is_placeholder": false
@@ -333,7 +333,7 @@
333
333
  "orig_type": "list[Literal[tasks, actions, assets, datasets, paths]]"
334
334
  }
335
335
  ],
336
- "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 ",
336
+ "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",
337
337
  "allow_extra": false,
338
338
  "parent": null,
339
339
  "is_placeholder": false
@@ -368,7 +368,7 @@
368
368
  "orig_type": "bool"
369
369
  }
370
370
  ],
371
- "description": "\n Populate Ellf with data for projects, tasks, actions, assets and paths.\n ",
371
+ "description": "\nPopulate Ellf with data for projects, tasks, actions, assets and paths.\n",
372
372
  "allow_extra": false,
373
373
  "parent": null,
374
374
  "is_placeholder": false
@@ -445,7 +445,7 @@
445
445
  "orig_type": "List[str]"
446
446
  }
447
447
  ],
448
- "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 ",
448
+ "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",
449
449
  "allow_extra": true,
450
450
  "parent": "actions",
451
451
  "is_placeholder": false
@@ -480,7 +480,7 @@
480
480
  "orig_type": "bool"
481
481
  }
482
482
  ],
483
- "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 ",
483
+ "description": "\nList the actions on the cluster. By default, this includes their ID, name\nand current state, e.g. created or completed\n",
484
484
  "allow_extra": false,
485
485
  "parent": "actions",
486
486
  "is_placeholder": false
@@ -926,7 +926,7 @@
926
926
  "orig_type": "List[str]"
927
927
  }
928
928
  ],
929
- "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 ",
929
+ "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",
930
930
  "allow_extra": true,
931
931
  "parent": "agents",
932
932
  "is_placeholder": false
@@ -1035,7 +1035,7 @@
1035
1035
  "orig_type": "bool"
1036
1036
  }
1037
1037
  ],
1038
- "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 ",
1038
+ "description": "\nList the agents on the cluster. By default, this includes their ID, name\nand current state, e.g. created or completed\n",
1039
1039
  "allow_extra": false,
1040
1040
  "parent": "agents",
1041
1041
  "is_placeholder": false
@@ -1529,7 +1529,7 @@
1529
1529
  "orig_type": "bool"
1530
1530
  }
1531
1531
  ],
1532
- "description": "\n Get detailed info for an asset uploaded to the cluster and registered\n with Ellf\n ",
1532
+ "description": "\nGet detailed info for an asset uploaded to the cluster and registered\nwith Ellf\n",
1533
1533
  "allow_extra": false,
1534
1534
  "parent": "assets",
1535
1535
  "is_placeholder": false
@@ -1629,7 +1629,7 @@
1629
1629
  "orig_type": "bool"
1630
1630
  }
1631
1631
  ],
1632
- "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 ",
1632
+ "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",
1633
1633
  "allow_extra": false,
1634
1634
  "parent": "assets",
1635
1635
  "is_placeholder": false
@@ -1700,7 +1700,7 @@
1700
1700
  "import": {
1701
1701
  "name": "import",
1702
1702
  "args": [],
1703
- "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 ",
1703
+ "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",
1704
1704
  "allow_extra": false,
1705
1705
  "parent": "auth",
1706
1706
  "is_placeholder": false
@@ -1735,7 +1735,7 @@
1735
1735
  "orig_type": "str"
1736
1736
  }
1737
1737
  ],
1738
- "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 ",
1738
+ "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",
1739
1739
  "allow_extra": false,
1740
1740
  "parent": "auth",
1741
1741
  "is_placeholder": false
@@ -1903,7 +1903,7 @@
1903
1903
  "orig_type": "Union[str, UUID]"
1904
1904
  }
1905
1905
  ],
1906
- "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 ",
1906
+ "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",
1907
1907
  "allow_extra": false,
1908
1908
  "parent": "clusters",
1909
1909
  "is_placeholder": false
@@ -1990,7 +1990,7 @@
1990
1990
  "orig_type": "bool"
1991
1991
  }
1992
1992
  ],
1993
- "description": "Check the health of a cluster deployment.\n\n Runs CLI-side connectivity checks against the cluster and PAM.\n Use --deep to also trigger cluster-side deployment checks (K8s API,\n NFS, database, etc.).\n ",
1993
+ "description": "Check the health of a cluster deployment.\n\nRuns CLI-side connectivity checks against the cluster and PAM.\nUse --deep to also trigger cluster-side deployment checks (K8s API,\nNFS, database, etc.).\n",
1994
1994
  "allow_extra": false,
1995
1995
  "parent": "clusters",
1996
1996
  "is_placeholder": false
@@ -2073,7 +2073,7 @@
2073
2073
  "orig_type": "str"
2074
2074
  }
2075
2075
  ],
2076
- "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 ",
2076
+ "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",
2077
2077
  "allow_extra": false,
2078
2078
  "parent": "clusters",
2079
2079
  "is_placeholder": false
@@ -2858,7 +2858,7 @@
2858
2858
  "orig_type": "str"
2859
2859
  }
2860
2860
  ],
2861
- "description": "Export all the examples from a dataset and save it in the designated file as\n JSONL (newline-delimited JSON).\n ",
2861
+ "description": "Export all the examples from a dataset and save it in the designated file as\nJSONL (newline-delimited JSON).\n",
2862
2862
  "allow_extra": false,
2863
2863
  "parent": "datasets",
2864
2864
  "is_placeholder": false
@@ -3293,7 +3293,7 @@
3293
3293
  "orig_type": "bool"
3294
3294
  }
3295
3295
  ],
3296
- "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 ",
3296
+ "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",
3297
3297
  "allow_extra": false,
3298
3298
  "parent": "infra",
3299
3299
  "is_placeholder": false
@@ -3537,7 +3537,7 @@
3537
3537
  "orig_type": "str"
3538
3538
  }
3539
3539
  ],
3540
- "description": "Install cluster infrastructure prerequisites (Traefik, cert-manager).\n\n These operations are idempotent and safe to re-run.\n ",
3540
+ "description": "Install cluster infrastructure prerequisites (Traefik, cert-manager).\n\nThese operations are idempotent and safe to re-run.\n",
3541
3541
  "allow_extra": false,
3542
3542
  "parent": "infra",
3543
3543
  "is_placeholder": false
@@ -3820,7 +3820,7 @@
3820
3820
  "orig_type": "str"
3821
3821
  }
3822
3822
  ],
3823
- "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 ",
3823
+ "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",
3824
3824
  "allow_extra": false,
3825
3825
  "parent": "infra",
3826
3826
  "is_placeholder": false
@@ -3844,7 +3844,7 @@
3844
3844
  "orig_type": "str"
3845
3845
  }
3846
3846
  ],
3847
- "description": "\n Run a job directly on the cluster from a YAML spec file, bypassing PAM.\n ",
3847
+ "description": "\nRun a job directly on the cluster from a YAML spec file, bypassing PAM.\n",
3848
3848
  "allow_extra": false,
3849
3849
  "parent": "jobs",
3850
3850
  "is_placeholder": false
@@ -4922,7 +4922,7 @@
4922
4922
  "orig_type": "str"
4923
4923
  }
4924
4924
  ],
4925
- "description": "\n Upload and advertise a recipes package from your Python environment.\n ",
4925
+ "description": "\nUpload and advertise a recipes package from your Python environment.\n",
4926
4926
  "allow_extra": false,
4927
4927
  "parent": "publish",
4928
4928
  "is_placeholder": false
@@ -5035,7 +5035,7 @@
5035
5035
  "orig_type": "bool"
5036
5036
  }
5037
5037
  ],
5038
- "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 ",
5038
+ "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",
5039
5039
  "allow_extra": false,
5040
5040
  "parent": "publish",
5041
5041
  "is_placeholder": false
@@ -5708,7 +5708,7 @@
5708
5708
  "orig_type": "List[str]"
5709
5709
  }
5710
5710
  ],
5711
- "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 ",
5711
+ "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",
5712
5712
  "allow_extra": true,
5713
5713
  "parent": "tasks",
5714
5714
  "is_placeholder": false
@@ -5743,7 +5743,7 @@
5743
5743
  "orig_type": "bool"
5744
5744
  }
5745
5745
  ],
5746
- "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 ",
5746
+ "description": "\nList the tasks on the cluster. By default, this includes their ID, name\nand current state, e.g. created or completed\n",
5747
5747
  "allow_extra": false,
5748
5748
  "parent": "tasks",
5749
5749
  "is_placeholder": false
@@ -6174,7 +6174,7 @@
6174
6174
  "orig_type": "bool"
6175
6175
  }
6176
6176
  ],
6177
- "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 ",
6177
+ "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",
6178
6178
  "allow_extra": false,
6179
6179
  "parent": "tasks",
6180
6180
  "is_placeholder": false
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env python3
2
+ from __future__ import annotations
3
+
4
+ import json
5
+ import os
6
+ import subprocess
7
+ import sys
8
+ from datetime import datetime, timezone
9
+ from pathlib import Path
10
+
11
+
12
+ def _load_hook_input() -> dict:
13
+ try:
14
+ raw = sys.stdin.read()
15
+ except Exception:
16
+ return {}
17
+ if not raw.strip():
18
+ return {}
19
+ try:
20
+ data = json.loads(raw)
21
+ except json.JSONDecodeError:
22
+ return {}
23
+ return data if isinstance(data, dict) else {}
24
+
25
+
26
+ def _normalize_project_dir(project_dir: str) -> str:
27
+ cwd = Path(project_dir).resolve()
28
+ try:
29
+ result = subprocess.run(
30
+ ["git", "rev-parse", "--show-toplevel"],
31
+ check=False,
32
+ capture_output=True,
33
+ text=True,
34
+ cwd=str(cwd),
35
+ )
36
+ except Exception:
37
+ return str(cwd)
38
+ root = result.stdout.strip()
39
+ return str(Path(root).resolve()) if root else str(cwd)
40
+
41
+
42
+ def main() -> int:
43
+ hook_input = _load_hook_input()
44
+ session_id = str(
45
+ hook_input.get("session_id") or os.environ.get("CLAUDE_SESSION_ID", "")
46
+ ).strip()
47
+ project_dir = str(
48
+ hook_input.get("cwd") or os.environ.get("CLAUDE_PROJECT_DIR", "")
49
+ ).strip()
50
+ if not session_id or not project_dir:
51
+ return 0
52
+
53
+ target = Path.home() / ".claude" / "current_session.json"
54
+ target.parent.mkdir(parents=True, exist_ok=True)
55
+
56
+ payload = {
57
+ "session_id": session_id,
58
+ "project_dir": _normalize_project_dir(project_dir),
59
+ "updated_at": datetime.now(timezone.utc)
60
+ .isoformat(timespec="seconds")
61
+ .replace("+00:00", "Z"),
62
+ }
63
+
64
+ tmp_path = target.with_suffix(".tmp")
65
+ tmp_path.write_text(json.dumps(payload), encoding="utf-8")
66
+ tmp_path.replace(target)
67
+ return 0
68
+
69
+
70
+ if __name__ == "__main__":
71
+ raise SystemExit(main())
@@ -0,0 +1,37 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "matcher": "",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "python3 \"$CLAUDE_PLUGIN_ROOT/bin/write-current-session.py\""
10
+ }
11
+ ]
12
+ }
13
+ ],
14
+ "UserPromptSubmit": [
15
+ {
16
+ "matcher": "",
17
+ "hooks": [
18
+ {
19
+ "type": "command",
20
+ "command": "python3 \"$CLAUDE_PLUGIN_ROOT/bin/write-current-session.py\""
21
+ }
22
+ ]
23
+ }
24
+ ],
25
+ "PreToolUse": [
26
+ {
27
+ "matcher": "",
28
+ "hooks": [
29
+ {
30
+ "type": "command",
31
+ "command": "python3 \"$CLAUDE_PLUGIN_ROOT/bin/write-current-session.py\""
32
+ }
33
+ ]
34
+ }
35
+ ]
36
+ }
37
+ }
@@ -0,0 +1,168 @@
1
+ ---
2
+ name: ellf-annotate
3
+ description: "Set up and launch annotation in the Ellf cluster once the methodology, schema, and data are ready. Use when the user wants to start annotating data in Ellf, launch an annotation task, choose the right built-in Ellf recipe, verify that annotation is ready to launch, run a review workflow, or add an annotation agent to a task. Also trigger on \"I want to annotate\", \"start annotation\", \"set up a labeling task\", \"which Ellf recipe should I use\", \"launch a review task\", \"start review\", \"set up an annotation agent\", or \"help me run annotation in Ellf\". This skill is the annotation readiness gatekeeper: it applies the audit checklist before launch, prefers built-in Ellf task recipes when possible, and delegates to `/ellf-prodigy` when a new custom recipe must be implemented."
4
+ argument-hint: "[describe what you want to annotate]"
5
+ ---
6
+
7
+ # Launch Annotation In Ellf
8
+
9
+ Help the user get from an annotation-ready plan to a working Ellf task.
10
+
11
+ $ARGUMENTS
12
+
13
+ ## Your role
14
+
15
+ You are responsible for:
16
+ - checking that annotation is ready to launch
17
+ - choosing the right built-in Ellf annotation and/or agent task
18
+ - deciding whether an existing custom recipe is sufficient
19
+ - deciding when a new custom recipe is required
20
+ - setting up the Ellf task
21
+ - optionally setting up an annotation agent after the task is sound
22
+ - verifying that the task is actually running and accessible
23
+
24
+ You do not implement new recipes in this skill. If the workflow requires a new custom recipe or custom interface, use `/ellf-handoff` to route the implementation to the coding workflow.
25
+
26
+ ## Required readiness audit
27
+
28
+ Before choosing a recipe or building a launch spec, read:
29
+
30
+ - `${CLAUDE_SKILL_DIR}/references/annotation_audit.md`
31
+ - `${CLAUDE_SKILL_DIR}/references/builtin_ellf_annotation_recipes.md`
32
+
33
+ The audit exists because launching with a poorly designed schema or a mismatched recipe wastes annotation effort and produces training data the model can't learn from. Use it to catch problems before you touch the platform.
34
+
35
+ Do not launch until you have confirmed:
36
+ - the annotation objective is clear
37
+ - the schema or review target is stable enough
38
+ - the recipe choice actually matches the task
39
+ - the input data is ready
40
+ - the target dataset is clear
41
+
42
+ If the audit surfaces a problem:
43
+ - methodological issues (schema design, task decomposition) → route to `/ellf-project`
44
+ - recipe implementation needs (custom UI, routing logic) → route to `/ellf-handoff`
45
+
46
+ ## Recipe selection
47
+
48
+ ### Built-in task recipe first
49
+
50
+ Prefer a built-in Ellf task recipe whenever it fits cleanly.
51
+ The built-in recipes are documented in `${CLAUDE_SKILL_DIR}/references/builtin_ellf_annotation_recipes.md`
52
+
53
+ Call `mcp__pam__recipe_list` to confirm the recipe is available in the current environment before committing to it.
54
+
55
+ ### Existing custom recipe
56
+
57
+ If the user names an existing cluster recipe and it matches the workflow, use it.
58
+
59
+ ### New custom recipe required
60
+
61
+ If the audit shows the user needs a custom interface, routing logic, or annotation flow that built-ins cannot express cleanly:
62
+ - do not force a bad built-in fit
63
+ - use `/ellf-handoff` to assign custom recipe implementation to the coding agent
64
+ - describe what the custom recipe must do
65
+
66
+ ## Annotation agents
67
+
68
+ If the user wants automated annotation:
69
+ - first ensure the base task is methodologically sound
70
+ - create and start the task first
71
+ - then identify an annotation-capable `agent_recipe`
72
+ - create and start the agent
73
+ - assign the agent to the task
74
+
75
+ Do not treat the agent as a replacement for task setup. The task is the base annotation workflow.
76
+
77
+ ## Recipe arguments
78
+
79
+ Once the recipe is selected:
80
+ - call `mcp__pam__recipe_list` to find the recipe ID
81
+ - call `mcp__pam__recipe_prepare_create` with the recipe ID and any known partial args
82
+ - treat the returned field spec as the authoritative source for: exact arg keys, required vs optional fields, missing required values, and dataset/asset/secret validation — this is the assistant-side equivalent of running `ellf-dev preview` locally
83
+ - fill args from context and the project plan where possible
84
+ - ask only for the values `mcp__pam__recipe_prepare_create` reports as missing and required
85
+
86
+ The annotation interface itself (what annotators see) cannot be previewed from the assistant. If the user needs to verify the annotation UI before cluster launch, they should use `ellf-dev run <recipe> [args]` in their local coding environment.
87
+
88
+ If too many required values are still missing, or the user would be better off reviewing the configuration visually, direct them to the appropriate task creation flow in the app instead of guessing.
89
+
90
+
91
+ ## Launch flow
92
+
93
+ ### 1. Confirm unresolved values
94
+
95
+ If required values are still missing:
96
+ - ask only for the missing values, tied directly to the recipe fields
97
+ - confirm the full configuration with `AskUserQuestion` before creating
98
+
99
+ ### 2. Create the task
100
+
101
+ ```
102
+ mcp__pam__task_create(
103
+ recipe_id="<from recipe_list>",
104
+ name="<task_name>",
105
+ args=<resolved from recipe_prepare_create>,
106
+ worker_class="<class if needed>"
107
+ )
108
+ ```
109
+
110
+ ### 3. Read back the created task
111
+
112
+ Call `mcp__pam__task_read` with the returned task ID. You need the full object to build the start payload — specifically `id`, `name`, `plan.container`, `plan.recipe_name`, `plan.args`, `plan.positional_fields`, `plan.cli_names`, `plan.package_name`, and `plan.objects`.
113
+
114
+ ### 4. Start the task
115
+
116
+ ```
117
+ mcp__broker__broker_request(
118
+ method="POST",
119
+ path="/api/v1/jobs/start-job",
120
+ body={
121
+ "job_id": "<task.id>",
122
+ "job_type": "task",
123
+ "name": "<task.name>",
124
+ "container": "<task.plan.container>",
125
+ "plan": {
126
+ "recipe_name": "<task.plan.recipe_name>",
127
+ "args": "<task.plan.args>",
128
+ "positional_fields": "<task.plan.positional_fields>",
129
+ "cli_names": "<task.plan.cli_names>",
130
+ "package_name": "<task.plan.package_name>",
131
+ "objects": "<task.plan.objects>"
132
+ }
133
+ }
134
+ )
135
+ ```
136
+
137
+ Do not omit fields from `plan`.
138
+
139
+ ### 5. Add an annotation agent if requested
140
+
141
+ If the user wants automated annotation:
142
+ 1. call `mcp__pam__recipe_list` to find an annotation-capable agent recipe
143
+ 2. call `mcp__pam__recipe_prepare_create` to get the agent args
144
+ 3. create the agent with `mcp__pam__agent_create`
145
+ 4. read it back with `mcp__pam__agent_read` to get the full plan
146
+ 5. start it via broker `/api/v1/jobs/start-job` with `"job_type": "agent"`
147
+ 6. assign it with `mcp__pam__task_assign_bot(task_id=..., agent_id=...)`
148
+
149
+ ## Verification after launch
150
+
151
+ A launch is not complete until you verify the task is usable.
152
+
153
+ After start:
154
+ - check broker status at `GET /api/v1/jobs/{id}/status`
155
+ - confirm the task is running or healthy
156
+ - provide the task mention/link and tell the user where to open it in the app
157
+ - if an agent was added, confirm it is assigned with `mcp__pam__task_bots_read`
158
+
159
+ If startup or assignment fails:
160
+ - inspect the broker error or logs at `GET /api/v1/jobs/{id}/logs`
161
+ - if this is an operational problem, use `/ellf-monitor` (or consult `/ellf-ops` for the relevant broker/PAM commands)
162
+ - if this is a recipe-capability problem, use `/ellf-handoff`
163
+
164
+ When you finish:
165
+ - state whether the setup passed the readiness audit
166
+ - state which recipe path you selected
167
+ - summarize the launch spec
168
+ - if not launching, explain exactly what is missing and where you are routing the user next
@@ -183,11 +183,3 @@ When you finish:
183
183
  - state which runtime target will be used
184
184
  - summarize the launch spec clearly
185
185
  - if not launching, explain exactly what is missing and where you are routing the user next
186
-
187
- ## Reference files
188
-
189
- | File | What it covers | When to read |
190
- |------|---------------|--------------|
191
- | `${CLAUDE_SKILL_DIR}/references/annotation_audit.md` | Readiness checklist: objective, schema, recipe fit, data, dataset | Before every launch |
192
- | `${CLAUDE_SKILL_DIR}/references/builtin_ellf_annotation_recipes.md` | Built-in Ellf task and agent recipes with supported workflows | Recipe selection for cluster |
193
- | `${CLAUDE_SKILL_DIR}/references/builtin_prodigy_recipes.md` | Built-in standalone Prodigy recipes | Recipe selection for local |
@@ -21,7 +21,6 @@ the **AskUserQuestion** tool to ask — do NOT ask in plain text.
21
21
  |---|---|
22
22
  | **description** | Specific and actionable. Not "implement NER" but "Create a custom ner.correct recipe with Ctrl+Enter keybinding for accept_best." |
23
23
  | **context_summary** | 2-3 paragraphs condensing the conversation: what was discussed, decisions made, constraints, label schemes, data formats. |
24
- | **plan_docs** | List of plan names the coding agent should read for project context. Use `project_plan_list` to see what exists, then pass only the plans relevant to this handoff (e.g. the overview plan plus the component plan the work targets). Leave empty if no plans exist yet. |
25
24
 
26
25
  ## Step 2: Create the request
27
26
 
@@ -30,8 +29,7 @@ Call the `todo_create` PAM tool — do NOT use Bash or ellf:
30
29
  ```
31
30
  todo_create(
32
31
  description="<description>",
33
- context_summary="<context_summary>",
34
- plan_docs=["project_plan", ...]
32
+ context_summary="<context_summary>"
35
33
  )
36
34
  ```
37
35