crewai-cli 1.14.8a2.dev20260619__tar.gz → 1.14.8a2.dev20260623__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 (153) hide show
  1. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/PKG-INFO +2 -2
  2. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/pyproject.toml +1 -1
  3. crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/__init__.py +1 -0
  4. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/cli.py +24 -28
  5. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/create_flow.py +53 -2
  6. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/create_json_crew.py +1 -1
  7. crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/deploy/archive.py +143 -0
  8. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/deploy/validate.py +26 -6
  9. crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/plot_flow.py +31 -0
  10. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/run_crew.py +92 -25
  11. crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/run_declarative_flow.py +212 -0
  12. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/AGENTS.md +1 -1
  13. crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/templates/declarative_flow/.gitignore +5 -0
  14. crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/templates/declarative_flow/README.md +17 -0
  15. crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/templates/declarative_flow/flow.yaml +15 -0
  16. crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/templates/declarative_flow/pyproject.toml +20 -0
  17. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/deploy/test_archive.py +66 -32
  18. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/deploy/test_validate.py +35 -0
  19. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_cli.py +67 -12
  20. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_create_crew.py +19 -1
  21. crewai_cli-1.14.8a2.dev20260623/tests/test_create_flow.py +35 -0
  22. crewai_cli-1.14.8a2.dev20260623/tests/test_flow_commands.py +117 -0
  23. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_run_crew.py +128 -0
  24. crewai_cli-1.14.8a2.dev20260623/tests/test_run_declarative_flow.py +111 -0
  25. crewai_cli-1.14.8a2.dev20260619/src/crewai_cli/__init__.py +0 -1
  26. crewai_cli-1.14.8a2.dev20260619/src/crewai_cli/deploy/archive.py +0 -409
  27. crewai_cli-1.14.8a2.dev20260619/src/crewai_cli/kickoff_flow.py +0 -23
  28. crewai_cli-1.14.8a2.dev20260619/src/crewai_cli/plot_flow.py +0 -23
  29. crewai_cli-1.14.8a2.dev20260619/src/crewai_cli/run_flow_definition.py +0 -113
  30. crewai_cli-1.14.8a2.dev20260619/tests/test_run_flow_definition.py +0 -156
  31. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/.gitignore +0 -0
  32. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/README.md +0 -0
  33. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/add_crew_to_flow.py +0 -0
  34. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/__init__.py +0 -0
  35. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/constants.py +0 -0
  36. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/main.py +0 -0
  37. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/providers/__init__.py +0 -0
  38. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/providers/auth0.py +0 -0
  39. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/providers/base_provider.py +0 -0
  40. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/providers/entra_id.py +0 -0
  41. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/providers/keycloak.py +0 -0
  42. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/providers/okta.py +0 -0
  43. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/providers/workos.py +0 -0
  44. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/token.py +0 -0
  45. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/utils.py +0 -0
  46. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/checkpoint_cli.py +0 -0
  47. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/checkpoint_tui.py +0 -0
  48. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/command.py +0 -0
  49. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/config.py +0 -0
  50. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/constants.py +0 -0
  51. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/create_crew.py +0 -0
  52. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/crew_chat.py +0 -0
  53. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/crew_run_tui.py +0 -0
  54. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/deploy/__init__.py +0 -0
  55. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/deploy/main.py +0 -0
  56. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/enterprise/__init__.py +0 -0
  57. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/enterprise/main.py +0 -0
  58. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/evaluate_crew.py +0 -0
  59. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/experimental/__init__.py +0 -0
  60. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/experimental/skills/__init__.py +0 -0
  61. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/experimental/skills/main.py +0 -0
  62. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/git.py +0 -0
  63. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/install_crew.py +0 -0
  64. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/memory_tui.py +0 -0
  65. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/organization/__init__.py +0 -0
  66. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/organization/main.py +0 -0
  67. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/plus_api.py +0 -0
  68. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/provider.py +0 -0
  69. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/py.typed +0 -0
  70. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/remote_template/__init__.py +0 -0
  71. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/remote_template/main.py +0 -0
  72. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/replay_from_task.py +0 -0
  73. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/reset_memories_command.py +0 -0
  74. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/settings/__init__.py +0 -0
  75. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/settings/main.py +0 -0
  76. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/shared/__init__.py +0 -0
  77. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/shared/token_manager.py +0 -0
  78. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/task_outputs.py +0 -0
  79. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/__init__.py +0 -0
  80. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/.gitignore +0 -0
  81. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/README.md +0 -0
  82. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/__init__.py +0 -0
  83. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/config/agents.yaml +0 -0
  84. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/config/tasks.yaml +0 -0
  85. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/crew.py +0 -0
  86. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/knowledge/user_preference.txt +0 -0
  87. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/main.py +0 -0
  88. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/pyproject.toml +0 -0
  89. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/skills/.gitkeep +0 -0
  90. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/tools/__init__.py +0 -0
  91. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/tools/custom_tool.py +0 -0
  92. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/.gitignore +0 -0
  93. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/README.md +0 -0
  94. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/__init__.py +0 -0
  95. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/crews/content_crew/config/agents.yaml +0 -0
  96. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/crews/content_crew/config/tasks.yaml +0 -0
  97. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/crews/content_crew/content_crew.py +0 -0
  98. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/main.py +0 -0
  99. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/pyproject.toml +0 -0
  100. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/skills/.gitkeep +0 -0
  101. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/tools/__init__.py +0 -0
  102. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/tools/custom_tool.py +0 -0
  103. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/tool/.gitignore +0 -0
  104. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/tool/README.md +0 -0
  105. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/tool/pyproject.toml +0 -0
  106. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/tool/src/{{folder_name}}/__init__.py +0 -0
  107. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/tool/src/{{folder_name}}/tool.py +0 -0
  108. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/tools/__init__.py +0 -0
  109. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/tools/main.py +0 -0
  110. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/train_crew.py +0 -0
  111. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/triggers/__init__.py +0 -0
  112. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/triggers/main.py +0 -0
  113. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/tui_picker.py +0 -0
  114. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/update_crew.py +0 -0
  115. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/user_data.py +0 -0
  116. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/utils.py +0 -0
  117. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/version.py +0 -0
  118. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/__init__.py +0 -0
  119. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/__init__.py +0 -0
  120. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/providers/__init__.py +0 -0
  121. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/providers/test_auth0.py +0 -0
  122. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/providers/test_entra_id.py +0 -0
  123. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/providers/test_keycloak.py +0 -0
  124. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/providers/test_okta.py +0 -0
  125. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/providers/test_workos.py +0 -0
  126. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/test_auth_main.py +0 -0
  127. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/test_utils.py +0 -0
  128. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/deploy/__init__.py +0 -0
  129. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/deploy/test_deploy_main.py +0 -0
  130. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/enterprise/__init__.py +0 -0
  131. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/enterprise/test_main.py +0 -0
  132. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/experimental/__init__.py +0 -0
  133. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/experimental/skills/__init__.py +0 -0
  134. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/experimental/skills/test_main.py +0 -0
  135. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/organization/__init__.py +0 -0
  136. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/organization/test_main.py +0 -0
  137. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/skills/__init__.py +0 -0
  138. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_click_compatibility.py +0 -0
  139. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_config.py +0 -0
  140. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_constants.py +0 -0
  141. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_crew_run_tui.py +0 -0
  142. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_crew_test.py +0 -0
  143. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_git.py +0 -0
  144. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_install_crew.py +0 -0
  145. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_plus_api.py +0 -0
  146. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_settings_command.py +0 -0
  147. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_token_manager.py +0 -0
  148. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_train_crew.py +0 -0
  149. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_utils.py +0 -0
  150. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_version.py +0 -0
  151. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/tools/__init__.py +0 -0
  152. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/tools/test_main.py +0 -0
  153. {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/triggers/test_main.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crewai-cli
3
- Version: 1.14.8a2.dev20260619
3
+ Version: 1.14.8a2.dev20260623
4
4
  Summary: CLI for CrewAI — scaffold, run, deploy and manage AI agent crews.
5
5
  Project-URL: Homepage, https://crewai.com
6
6
  Project-URL: Documentation, https://docs.crewai.com
@@ -10,7 +10,7 @@ Requires-Python: <3.14,>=3.10
10
10
  Requires-Dist: appdirs~=1.4.4
11
11
  Requires-Dist: certifi
12
12
  Requires-Dist: click<9,>=8.1.7
13
- Requires-Dist: crewai-core==1.14.8a2.dev20260619
13
+ Requires-Dist: crewai-core==1.14.8a2.dev20260623
14
14
  Requires-Dist: cryptography>=42.0
15
15
  Requires-Dist: httpx~=0.28.1
16
16
  Requires-Dist: packaging>=23.0
@@ -8,7 +8,7 @@ authors = [
8
8
  ]
9
9
  requires-python = ">=3.10, <3.14"
10
10
  dependencies = [
11
- "crewai-core==1.14.8a2.dev20260619",
11
+ "crewai-core==1.14.8a2.dev20260623",
12
12
  "click>=8.1.7,<9",
13
13
  "pydantic>=2.11.9,<2.13",
14
14
  "pydantic-settings~=2.10.1",
@@ -0,0 +1 @@
1
+ __version__ = "1.14.8a2.dev20260623"
@@ -40,14 +40,6 @@ def replay_task_command(*args: Any, **kwargs: Any) -> Any:
40
40
  return _replay_task_command(*args, **kwargs)
41
41
 
42
42
 
43
- def run_flow_definition(*args: Any, **kwargs: Any) -> Any:
44
- from crewai_cli.run_flow_definition import (
45
- run_flow_definition as _run_flow_definition,
46
- )
47
-
48
- return _run_flow_definition(*args, **kwargs)
49
-
50
-
51
43
  def run_crew(*args: Any, **kwargs: Any) -> Any:
52
44
  from crewai_cli.run_crew import run_crew as _run_crew
53
45
 
@@ -155,12 +147,18 @@ def uv(uv_args: tuple[str, ...]) -> None:
155
147
  is_flag=True,
156
148
  help="Use classic Python/YAML project structure instead of JSON",
157
149
  )
150
+ @click.option(
151
+ "--declarative",
152
+ is_flag=True,
153
+ help="Create a declarative Flow project instead of a Python Flow project",
154
+ )
158
155
  def create(
159
156
  type: str | None,
160
157
  name: str | None,
161
158
  provider: str | None,
162
159
  skip_provider: bool = False,
163
160
  classic: bool = False,
161
+ declarative: bool = False,
164
162
  ) -> None:
165
163
  """Create a new crew, or flow."""
166
164
  dmn_mode = is_dmn_mode_enabled()
@@ -194,6 +192,8 @@ def create(
194
192
  if dmn_mode:
195
193
  skip_provider = True
196
194
  if type == "crew":
195
+ if declarative:
196
+ raise click.UsageError("--declarative can only be used with flow projects")
197
197
  if classic:
198
198
  from crewai_cli.create_crew import create_crew
199
199
 
@@ -205,7 +205,7 @@ def create(
205
205
  elif type == "flow":
206
206
  from crewai_cli.create_flow import create_flow
207
207
 
208
- create_flow(name)
208
+ create_flow(name, declarative=declarative)
209
209
  else:
210
210
  click.secho("Error: Invalid type. Must be 'crew' or 'flow'.", fg="red")
211
211
 
@@ -468,7 +468,7 @@ def memory(
468
468
  type=str,
469
469
  default=None,
470
470
  help=(
471
- "Path to a trained-agents pickle (produced by `crewai train -f`). "
471
+ "Crew-only: path to a trained-agents pickle (produced by `crewai train -f`). "
472
472
  "When set, agents load suggestions from this file instead of the "
473
473
  "default trained_agents_data.pkl. Equivalent to setting "
474
474
  "CREWAI_TRAINED_AGENTS_FILE."
@@ -512,16 +512,13 @@ def install(context: click.Context) -> None:
512
512
  "--definition",
513
513
  type=str,
514
514
  default=None,
515
- help=(
516
- "Experimental: path to a Flow Definition YAML/JSON file, "
517
- "or an inline YAML/JSON string."
518
- ),
515
+ help="Flow-only: path to a declarative flow definition.",
519
516
  )
520
517
  @click.option(
521
518
  "--inputs",
522
519
  type=str,
523
520
  default=None,
524
- help='Experimental: JSON object passed to flow.kickoff(), e.g. \'{"topic":"AI"}\'.',
521
+ help='Flow-only: JSON object passed to the declarative flow, e.g. \'{"topic":"AI"}\'.',
525
522
  )
526
523
  def run(
527
524
  trained_agents_file: str | None,
@@ -531,16 +528,14 @@ def run(
531
528
  """Run the Crew or Flow."""
532
529
  if inputs is not None and definition is None:
533
530
  raise click.UsageError("--inputs requires --definition")
531
+ if trained_agents_file is not None and definition is not None:
532
+ raise click.UsageError("--filename can only be used when running crews")
534
533
 
535
- if definition is not None:
536
- click.secho(
537
- "Warning: `crewai run --definition` is experimental and may change without notice.",
538
- fg="yellow",
539
- )
540
- run_flow_definition(definition=definition, inputs=inputs)
541
- return
542
-
543
- run_crew(trained_agents_file=trained_agents_file)
534
+ run_crew(
535
+ trained_agents_file=trained_agents_file,
536
+ definition=definition,
537
+ inputs=inputs,
538
+ )
544
539
 
545
540
 
546
541
  @crewai.command()
@@ -795,10 +790,11 @@ def flow() -> None:
795
790
  @flow.command(name="kickoff")
796
791
  def flow_run() -> None:
797
792
  """Kickoff the Flow."""
798
- from crewai_cli.kickoff_flow import kickoff_flow
799
-
800
- click.echo("Running the Flow")
801
- kickoff_flow()
793
+ click.secho(
794
+ "The command 'crewai flow kickoff' is deprecated. Use 'crewai run' instead.",
795
+ fg="yellow",
796
+ )
797
+ run_crew(trained_agents_file=None, definition=None, inputs=None)
802
798
 
803
799
 
804
800
  @flow.command(name="plot")
@@ -5,7 +5,10 @@ import click
5
5
  from crewai_core.telemetry import Telemetry
6
6
 
7
7
 
8
- def create_flow(name: str) -> None:
8
+ DECLARATIVE_FLOW_FOLDERS = ("crews", "tools", "knowledge", "skills")
9
+
10
+
11
+ def create_flow(name: str, *, declarative: bool = False) -> None:
9
12
  """Create a new flow."""
10
13
  folder_name = name.replace(" ", "_").replace("-", "_").lower()
11
14
  class_name = name.replace("_", " ").replace("-", " ").title().replace(" ", "")
@@ -20,6 +23,17 @@ def create_flow(name: str) -> None:
20
23
  telemetry = Telemetry()
21
24
  telemetry.flow_creation_span(class_name)
22
25
 
26
+ if declarative:
27
+ _create_declarative_flow(name, class_name, folder_name, project_root)
28
+ else:
29
+ _create_python_flow(name, class_name, folder_name, project_root)
30
+
31
+ click.secho(f"Flow {name} created successfully!", fg="green", bold=True)
32
+
33
+
34
+ def _create_python_flow(
35
+ name: str, class_name: str, folder_name: str, project_root: Path
36
+ ) -> None:
23
37
  (project_root / "src" / folder_name).mkdir(parents=True)
24
38
  (project_root / "src" / folder_name / "crews").mkdir(parents=True)
25
39
  (project_root / "src" / folder_name / "tools").mkdir(parents=True)
@@ -92,4 +106,41 @@ def create_flow(name: str) -> None:
92
106
  fg="yellow",
93
107
  )
94
108
 
95
- click.secho(f"Flow {name} created successfully!", fg="green", bold=True)
109
+
110
+ def _create_declarative_flow(
111
+ name: str, class_name: str, folder_name: str, project_root: Path
112
+ ) -> None:
113
+ project_root.mkdir(parents=True)
114
+ package_root = project_root / "src" / folder_name
115
+ package_root.mkdir(parents=True)
116
+ for folder in DECLARATIVE_FLOW_FOLDERS:
117
+ (package_root / folder).mkdir()
118
+
119
+ package_dir = Path(__file__).parent
120
+ templates_dir = package_dir / "templates" / "declarative_flow"
121
+
122
+ agents_md_src = package_dir / "templates" / "AGENTS.md"
123
+ if agents_md_src.exists():
124
+ shutil.copy2(agents_md_src, project_root / "AGENTS.md")
125
+
126
+ for src_file in templates_dir.rglob("*"):
127
+ if not src_file.is_file():
128
+ continue
129
+
130
+ relative_path = src_file.relative_to(templates_dir)
131
+ dst_file = (
132
+ project_root / relative_path
133
+ if relative_path.name in {".gitignore", "README.md", "pyproject.toml"}
134
+ else package_root / relative_path
135
+ )
136
+ dst_file.parent.mkdir(parents=True, exist_ok=True)
137
+ content = src_file.read_text(encoding="utf-8")
138
+ content = content.replace("{{name}}", name)
139
+ content = content.replace("{{flow_name}}", class_name)
140
+ content = content.replace("{{folder_name}}", folder_name)
141
+ dst_file.write_text(content, encoding="utf-8")
142
+
143
+ (project_root / ".env").write_text("OPENAI_API_KEY=YOUR_API_KEY", encoding="utf-8")
144
+ (package_root / "__init__.py").write_text("", encoding="utf-8")
145
+ for folder in DECLARATIVE_FLOW_FOLDERS:
146
+ (package_root / folder / ".gitkeep").write_text("", encoding="utf-8")
@@ -680,7 +680,7 @@ def _default_agents_and_tasks(
680
680
  ]
681
681
  crew_settings = {
682
682
  "process": "sequential",
683
- "memory": False,
683
+ "memory": True,
684
684
  "inputs": {},
685
685
  }
686
686
  return agents, tasks, crew_settings
@@ -0,0 +1,143 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+ import shutil
5
+ import tempfile
6
+ import zipfile
7
+
8
+ from crewai_cli import git
9
+
10
+
11
+ _EXCLUDED_DIRS = {
12
+ ".crewai",
13
+ ".git",
14
+ ".mypy_cache",
15
+ ".pytest_cache",
16
+ ".ruff_cache",
17
+ ".tox",
18
+ ".venv",
19
+ "__pycache__",
20
+ "build",
21
+ "dist",
22
+ "env",
23
+ "venv",
24
+ }
25
+ _EXCLUDED_FILES = {
26
+ ".DS_Store",
27
+ ".env",
28
+ }
29
+ _ALLOWED_ENV_EXAMPLES = {
30
+ ".env.example",
31
+ ".env.sample",
32
+ }
33
+ _EXCLUDED_SUFFIXES = {
34
+ ".pyc",
35
+ ".pyo",
36
+ }
37
+
38
+
39
+ def create_project_zip(
40
+ project_name: str,
41
+ *,
42
+ project_dir: Path | None = None,
43
+ repository: git.Repository | None = None,
44
+ ) -> Path:
45
+ """Create a deployable ZIP archive for a CrewAI project."""
46
+ root = (project_dir or Path.cwd()).resolve()
47
+ files = _project_files(root, repository)
48
+ if not files:
49
+ raise ValueError("No deployable project files were found.")
50
+
51
+ staged_root = _stage_project(root, files)
52
+ archive_handle = tempfile.NamedTemporaryFile(
53
+ prefix=f"{project_name}-",
54
+ suffix=".zip",
55
+ delete=False,
56
+ )
57
+ archive_path = Path(archive_handle.name)
58
+ archive_handle.close()
59
+
60
+ try:
61
+ with zipfile.ZipFile(archive_path, "w", zipfile.ZIP_DEFLATED) as zip_file:
62
+ for relative_path in _walk_files(staged_root):
63
+ absolute_path = staged_root / relative_path
64
+ zip_file.write(absolute_path, relative_path.as_posix())
65
+ finally:
66
+ shutil.rmtree(staged_root, ignore_errors=True)
67
+
68
+ return archive_path
69
+
70
+
71
+ def _project_files(root: Path, repository: git.Repository | None = None) -> list[Path]:
72
+ """Return project-relative files to include in the archive."""
73
+ if repository is not None:
74
+ return _repository_project_files(root, repository)
75
+
76
+ try:
77
+ repository = git.Repository(path=str(root), fetch=False)
78
+ except ValueError:
79
+ repository = None
80
+
81
+ if repository is not None:
82
+ return _repository_project_files(root, repository)
83
+
84
+ return [
85
+ path
86
+ for path in _walk_files(root)
87
+ if not _is_excluded(path) and _is_regular_file(root / path)
88
+ ]
89
+
90
+
91
+ def _repository_project_files(root: Path, repository: git.Repository) -> list[Path]:
92
+ """Return deployable files from Git while applying local safety excludes."""
93
+ files = [Path(path) for path in repository.deployable_files()]
94
+ return [
95
+ path
96
+ for path in files
97
+ if not _is_excluded(path) and _is_regular_file(root / path)
98
+ ]
99
+
100
+
101
+ def _walk_files(root: Path) -> list[Path]:
102
+ """List regular files below root as project-relative paths."""
103
+ return [
104
+ path.relative_to(root) for path in root.rglob("*") if _is_regular_file(path)
105
+ ]
106
+
107
+
108
+ def _is_regular_file(path: Path) -> bool:
109
+ """Return True for regular files, excluding symlinks to files."""
110
+ return path.is_file() and not path.is_symlink()
111
+
112
+
113
+ def _is_excluded(path: Path) -> bool:
114
+ """Return True when a file should be omitted from deployment ZIPs."""
115
+ parts = set(path.parts)
116
+ if parts.intersection(_EXCLUDED_DIRS):
117
+ return True
118
+
119
+ name = path.name
120
+ if name in _EXCLUDED_FILES:
121
+ return True
122
+ if name.startswith(".env.") and name not in _ALLOWED_ENV_EXAMPLES:
123
+ return True
124
+ return path.suffix in _EXCLUDED_SUFFIXES
125
+
126
+
127
+ def _stage_project(root: Path, files: list[Path]) -> Path:
128
+ """Copy archive files into a temporary staging directory."""
129
+ staging_root = Path(tempfile.mkdtemp(prefix="crewai-deploy-"))
130
+
131
+ try:
132
+ for relative_path in files:
133
+ source = root / relative_path
134
+ if not _is_regular_file(source):
135
+ continue
136
+
137
+ destination = staging_root / relative_path
138
+ destination.parent.mkdir(parents=True, exist_ok=True)
139
+ shutil.copy2(source, destination)
140
+ except Exception:
141
+ shutil.rmtree(staging_root, ignore_errors=True)
142
+ raise
143
+ return staging_root
@@ -212,8 +212,16 @@ class DeployValidator:
212
212
  if crew_path is None:
213
213
  return self.results
214
214
 
215
+ agents_dir = self.project_root / "agents"
216
+
217
+ self._check_pyproject()
218
+ self._check_lockfile()
219
+ agents_dir_ok = self._check_json_agents_dir(agents_dir)
220
+
221
+ project = None
215
222
  try:
216
- project = validate_crew_project(crew_path, self.project_root / "agents")
223
+ if agents_dir_ok:
224
+ project = validate_crew_project(crew_path, agents_dir)
217
225
  except JSONProjectValidationError as e:
218
226
  self._add(
219
227
  Severity.ERROR,
@@ -232,15 +240,27 @@ class DeployValidator:
232
240
  )
233
241
  return self.results
234
242
 
235
- agents_dir = self.project_root / "agents"
236
-
237
- self._check_pyproject()
238
- self._check_lockfile()
239
- self._check_env_vars_json(crew_path, agents_dir, project.agent_names)
243
+ if project is not None:
244
+ self._check_env_vars_json(crew_path, agents_dir, project.agent_names)
240
245
  self._check_version_vs_lockfile()
241
246
 
242
247
  return self.results
243
248
 
249
+ def _check_json_agents_dir(self, agents_dir: Path) -> bool:
250
+ if agents_dir.is_dir():
251
+ return True
252
+ self._add(
253
+ Severity.ERROR,
254
+ "missing_agents_dir",
255
+ "Cannot find agents/ directory",
256
+ detail=(
257
+ "JSON crew projects load agent definitions from "
258
+ f"{agents_dir.relative_to(self.project_root)}/*.jsonc or *.json."
259
+ ),
260
+ hint="Create agents/ and add one JSON or JSONC file per agent.",
261
+ )
262
+ return False
263
+
244
264
  def _check_env_vars_json(
245
265
  self, crew_path: Path, agents_dir: Path, agent_names: list[str]
246
266
  ) -> None:
@@ -0,0 +1,31 @@
1
+ import subprocess
2
+
3
+ import click
4
+
5
+
6
+ def plot_flow() -> None:
7
+ """
8
+ Plot the flow from declarative config or the Python UV entrypoint.
9
+ """
10
+ from crewai_cli.run_declarative_flow import (
11
+ configured_project_declarative_flow,
12
+ plot_declarative_flow_in_project_env,
13
+ )
14
+
15
+ if definition := configured_project_declarative_flow():
16
+ plot_declarative_flow_in_project_env(definition)
17
+ else:
18
+ command = ["uv", "run", "plot"]
19
+
20
+ try:
21
+ subprocess.run( # noqa: S603
22
+ command, capture_output=False, text=True, check=True
23
+ )
24
+
25
+ except subprocess.CalledProcessError as e:
26
+ click.echo(f"An error occurred while plotting the flow: {e}", err=True)
27
+ raise SystemExit(1) from e
28
+
29
+ except Exception as e:
30
+ click.echo(f"An unexpected error occurred: {e}", err=True)
31
+ raise SystemExit(1) from e
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  from collections.abc import Callable
4
4
  from contextlib import AbstractContextManager, nullcontext
5
- from enum import Enum
6
5
  import os
7
6
  from pathlib import Path
8
7
  import re
@@ -27,11 +26,6 @@ if TYPE_CHECKING:
27
26
  from crewai_cli.crew_run_tui import CrewRunApp
28
27
 
29
28
 
30
- class CrewType(Enum):
31
- STANDARD = "standard"
32
- FLOW = "flow"
33
-
34
-
35
29
  # Must accept the same names as the kickoff interpolation pattern in
36
30
  # crewai.utilities.string_utils (_VARIABLE_PATTERN), including hyphens —
37
31
  # otherwise placeholders are interpolated at runtime but never prompted for.
@@ -537,7 +531,11 @@ def _print_post_tui_summary(app: CrewRunApp) -> None:
537
531
  )
538
532
 
539
533
 
540
- def run_crew(trained_agents_file: str | None = None) -> None:
534
+ def run_crew(
535
+ trained_agents_file: str | None = None,
536
+ definition: str | None = None,
537
+ inputs: str | None = None,
538
+ ) -> None:
541
539
  """Run the crew or flow.
542
540
 
543
541
  Args:
@@ -545,15 +543,88 @@ def run_crew(trained_agents_file: str | None = None) -> None:
545
543
  by ``crewai train -f``. When set, exported as
546
544
  ``CREWAI_TRAINED_AGENTS_FILE`` so agents load suggestions from this
547
545
  file instead of the default ``trained_agents_data.pkl``.
546
+ definition: Optional path to a declarative Flow definition.
547
+ inputs: Optional JSON object passed to a declarative Flow.
548
548
  """
549
- # JSON crew projects take precedence
549
+ if inputs is not None and definition is None:
550
+ raise click.UsageError("--inputs requires --definition")
551
+
552
+ if definition is not None:
553
+ _run_explicit_declarative_flow(
554
+ definition=definition,
555
+ inputs=inputs,
556
+ trained_agents_file=trained_agents_file,
557
+ )
558
+ return
559
+
550
560
  if _has_json_crew():
551
561
  _run_json_crew_in_project_env(trained_agents_file=trained_agents_file)
552
562
  return
553
563
 
564
+ pyproject_data = read_toml()
565
+ _warn_if_old_poetry_project(pyproject_data)
566
+ project_type = _get_project_type(pyproject_data)
567
+
568
+ if project_type == "flow":
569
+ _run_flow_project(
570
+ pyproject_data=pyproject_data,
571
+ trained_agents_file=trained_agents_file,
572
+ )
573
+ return
574
+
575
+ _run_classic_crew_project(
576
+ pyproject_data=pyproject_data,
577
+ trained_agents_file=trained_agents_file,
578
+ )
579
+
580
+
581
+ def _run_explicit_declarative_flow(
582
+ definition: str, inputs: str | None, trained_agents_file: str | None
583
+ ) -> None:
584
+ if trained_agents_file is not None:
585
+ raise click.UsageError("--filename can only be used when running crews")
586
+
587
+ from crewai_cli.run_declarative_flow import run_declarative_flow
588
+
589
+ run_declarative_flow(definition=definition, inputs=inputs)
590
+
591
+
592
+ def _run_flow_project(
593
+ pyproject_data: dict[str, Any], trained_agents_file: str | None
594
+ ) -> None:
595
+ if trained_agents_file is not None:
596
+ raise click.UsageError("--filename can only be used when running crews")
597
+
598
+ from crewai_cli.run_declarative_flow import (
599
+ configured_project_declarative_flow,
600
+ run_declarative_flow_in_project_env,
601
+ )
602
+
603
+ if definition := configured_project_declarative_flow(pyproject_data):
604
+ run_declarative_flow_in_project_env(definition=definition)
605
+ return
606
+
607
+ _execute_uv_script("kickoff", entity_type="flow")
608
+
609
+
610
+ def _run_classic_crew_project(
611
+ pyproject_data: dict[str, Any], trained_agents_file: str | None
612
+ ) -> None:
613
+ _execute_uv_script(
614
+ "run_crew",
615
+ entity_type="crew",
616
+ trained_agents_file=trained_agents_file,
617
+ )
618
+
619
+
620
+ def _get_project_type(pyproject_data: dict[str, Any]) -> str | None:
621
+ project_type = pyproject_data.get("tool", {}).get("crewai", {}).get("type")
622
+ return project_type if isinstance(project_type, str) else None
623
+
624
+
625
+ def _warn_if_old_poetry_project(pyproject_data: dict[str, Any]) -> None:
554
626
  crewai_version = get_crewai_version()
555
627
  min_required_version = "0.71.0"
556
- pyproject_data = read_toml()
557
628
 
558
629
  if pyproject_data.get("tool", {}).get("poetry") and (
559
630
  version.parse(crewai_version) < version.parse(min_required_version)
@@ -564,25 +635,22 @@ def run_crew(trained_agents_file: str | None = None) -> None:
564
635
  fg="red",
565
636
  )
566
637
 
567
- is_flow = pyproject_data.get("tool", {}).get("crewai", {}).get("type") == "flow"
568
- crew_type = CrewType.FLOW if is_flow else CrewType.STANDARD
569
-
570
- click.echo(f"Running the {'Flow' if is_flow else 'Crew'}")
571
-
572
- execute_command(crew_type, trained_agents_file=trained_agents_file)
573
-
574
638
 
575
- def execute_command(
576
- crew_type: CrewType, trained_agents_file: str | None = None
639
+ def _execute_uv_script(
640
+ script_name: str,
641
+ *,
642
+ entity_type: str,
643
+ trained_agents_file: str | None = None,
577
644
  ) -> None:
578
- """Execute the appropriate command based on crew type.
645
+ """Execute a project script through uv.
579
646
 
580
647
  Args:
581
- crew_type: The type of crew to run.
648
+ script_name: The project script to run.
649
+ entity_type: The user-facing entity being run.
582
650
  trained_agents_file: Optional trained-agents pickle path forwarded to
583
651
  the subprocess via the ``CREWAI_TRAINED_AGENTS_FILE`` env var.
584
652
  """
585
- command = ["uv", "run", "kickoff" if crew_type == CrewType.FLOW else "run_crew"]
653
+ command = ["uv", "run", script_name]
586
654
 
587
655
  env = build_env_with_all_tool_credentials()
588
656
  if trained_agents_file:
@@ -592,21 +660,20 @@ def execute_command(
592
660
  subprocess.run(command, capture_output=False, text=True, check=True, env=env) # noqa: S603
593
661
 
594
662
  except subprocess.CalledProcessError as e:
595
- handle_error(e, crew_type)
663
+ _handle_run_error(e, entity_type)
596
664
 
597
665
  except Exception as e:
598
666
  click.echo(f"An unexpected error occurred: {e}", err=True)
599
667
 
600
668
 
601
- def handle_error(error: subprocess.CalledProcessError, crew_type: CrewType) -> None:
669
+ def _handle_run_error(error: subprocess.CalledProcessError, entity_type: str) -> None:
602
670
  """
603
671
  Handle subprocess errors with appropriate messaging.
604
672
 
605
673
  Args:
606
674
  error: The subprocess error that occurred
607
- crew_type: The type of crew that was being run
675
+ entity_type: The type of entity that was being run
608
676
  """
609
- entity_type = "flow" if crew_type == CrewType.FLOW else "crew"
610
677
  click.echo(f"An error occurred while running the {entity_type}: {error}", err=True)
611
678
 
612
679
  if error.output: