crewai-cli 1.15.2a2.dev20260707__tar.gz → 1.15.2.dev20260710__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 (166) hide show
  1. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/PKG-INFO +2 -2
  2. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/pyproject.toml +1 -1
  3. crewai_cli-1.15.2.dev20260710/src/crewai_cli/__init__.py +1 -0
  4. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/cli.py +2 -2
  5. crewai_cli-1.15.2.dev20260710/src/crewai_cli/input_prompt.py +84 -0
  6. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/model_catalog.py +32 -16
  7. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/run_crew.py +116 -48
  8. crewai_cli-1.15.2.dev20260710/src/crewai_cli/run_declarative_flow.py +335 -0
  9. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_cli.py +6 -4
  10. crewai_cli-1.15.2.dev20260710/tests/test_input_prompt.py +82 -0
  11. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_model_catalog.py +65 -10
  12. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_run_crew.py +220 -7
  13. crewai_cli-1.15.2.dev20260710/tests/test_run_declarative_flow.py +402 -0
  14. crewai_cli-1.15.2a2.dev20260707/src/crewai_cli/__init__.py +0 -1
  15. crewai_cli-1.15.2a2.dev20260707/src/crewai_cli/run_declarative_flow.py +0 -180
  16. crewai_cli-1.15.2a2.dev20260707/tests/test_run_declarative_flow.py +0 -148
  17. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/.gitignore +0 -0
  18. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/README.md +0 -0
  19. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/add_crew_to_flow.py +0 -0
  20. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/__init__.py +0 -0
  21. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/constants.py +0 -0
  22. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/main.py +0 -0
  23. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/providers/__init__.py +0 -0
  24. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/providers/auth0.py +0 -0
  25. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/providers/base_provider.py +0 -0
  26. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/providers/entra_id.py +0 -0
  27. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/providers/keycloak.py +0 -0
  28. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/providers/okta.py +0 -0
  29. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/providers/workos.py +0 -0
  30. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/token.py +0 -0
  31. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/utils.py +0 -0
  32. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/checkpoint_cli.py +0 -0
  33. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/checkpoint_tui.py +0 -0
  34. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/command.py +0 -0
  35. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/config.py +0 -0
  36. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/constants.py +0 -0
  37. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/create_crew.py +0 -0
  38. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/create_flow.py +0 -0
  39. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/create_json_crew.py +0 -0
  40. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/crew_chat.py +0 -0
  41. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/crew_run_tui.py +0 -0
  42. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/deploy/__init__.py +0 -0
  43. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/deploy/archive.py +0 -0
  44. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/deploy/main.py +0 -0
  45. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/deploy/validate.py +0 -0
  46. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/enterprise/__init__.py +0 -0
  47. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/enterprise/main.py +0 -0
  48. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/evaluate_crew.py +0 -0
  49. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/experimental/__init__.py +0 -0
  50. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/experimental/skills/__init__.py +0 -0
  51. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/experimental/skills/main.py +0 -0
  52. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/git.py +0 -0
  53. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/install_crew.py +0 -0
  54. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/kickoff_flow.py +0 -0
  55. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/memory_tui.py +0 -0
  56. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/organization/__init__.py +0 -0
  57. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/organization/main.py +0 -0
  58. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/plot_flow.py +0 -0
  59. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/plus_api.py +0 -0
  60. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/provider.py +0 -0
  61. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/py.typed +0 -0
  62. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/remote_template/__init__.py +0 -0
  63. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/remote_template/main.py +0 -0
  64. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/replay_from_task.py +0 -0
  65. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/reset_memories_command.py +0 -0
  66. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/settings/__init__.py +0 -0
  67. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/settings/main.py +0 -0
  68. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/shared/__init__.py +0 -0
  69. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/shared/token_manager.py +0 -0
  70. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/task_outputs.py +0 -0
  71. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/AGENTS.md +0 -0
  72. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/__init__.py +0 -0
  73. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/.gitignore +0 -0
  74. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/README.md +0 -0
  75. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/__init__.py +0 -0
  76. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/config/agents.yaml +0 -0
  77. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/config/tasks.yaml +0 -0
  78. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/crew.py +0 -0
  79. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/knowledge/user_preference.txt +0 -0
  80. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/main.py +0 -0
  81. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/pyproject.toml +0 -0
  82. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/skills/.gitkeep +0 -0
  83. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/tools/__init__.py +0 -0
  84. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/tools/custom_tool.py +0 -0
  85. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/declarative_flow/.gitignore +0 -0
  86. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/declarative_flow/AGENTS.md +0 -0
  87. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/declarative_flow/README.md +0 -0
  88. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/declarative_flow/flow.yaml +0 -0
  89. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/declarative_flow/pyproject.toml +0 -0
  90. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/.gitignore +0 -0
  91. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/README.md +0 -0
  92. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/__init__.py +0 -0
  93. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/crews/content_crew/config/agents.yaml +0 -0
  94. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/crews/content_crew/config/tasks.yaml +0 -0
  95. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/crews/content_crew/content_crew.py +0 -0
  96. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/main.py +0 -0
  97. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/pyproject.toml +0 -0
  98. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/skills/.gitkeep +0 -0
  99. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/tools/__init__.py +0 -0
  100. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/tools/custom_tool.py +0 -0
  101. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/.gitignore +0 -0
  102. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/README.md +0 -0
  103. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/agent.jsonc +0 -0
  104. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/agent_settings.jsonc +0 -0
  105. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/crew.jsonc +0 -0
  106. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/knowledge/user_preference.txt +0 -0
  107. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/pyproject.toml +0 -0
  108. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/task.jsonc +0 -0
  109. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/tool/.gitignore +0 -0
  110. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/tool/README.md +0 -0
  111. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/tool/pyproject.toml +0 -0
  112. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/tool/src/{{folder_name}}/__init__.py +0 -0
  113. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/tool/src/{{folder_name}}/tool.py +0 -0
  114. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/tools/__init__.py +0 -0
  115. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/tools/main.py +0 -0
  116. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/train_crew.py +0 -0
  117. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/triggers/__init__.py +0 -0
  118. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/triggers/main.py +0 -0
  119. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/tui_picker.py +0 -0
  120. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/update_crew.py +0 -0
  121. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/user_data.py +0 -0
  122. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/utils.py +0 -0
  123. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/version.py +0 -0
  124. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/__init__.py +0 -0
  125. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/__init__.py +0 -0
  126. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/providers/__init__.py +0 -0
  127. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/providers/test_auth0.py +0 -0
  128. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/providers/test_entra_id.py +0 -0
  129. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/providers/test_keycloak.py +0 -0
  130. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/providers/test_okta.py +0 -0
  131. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/providers/test_workos.py +0 -0
  132. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/test_auth_main.py +0 -0
  133. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/test_utils.py +0 -0
  134. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/deploy/__init__.py +0 -0
  135. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/deploy/test_archive.py +0 -0
  136. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/deploy/test_deploy_main.py +0 -0
  137. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/deploy/test_validate.py +0 -0
  138. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/enterprise/__init__.py +0 -0
  139. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/enterprise/test_main.py +0 -0
  140. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/experimental/__init__.py +0 -0
  141. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/experimental/skills/__init__.py +0 -0
  142. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/experimental/skills/test_main.py +0 -0
  143. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/organization/__init__.py +0 -0
  144. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/organization/test_main.py +0 -0
  145. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/skills/__init__.py +0 -0
  146. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/skills/test_safe_extract.py +0 -0
  147. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_click_compatibility.py +0 -0
  148. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_config.py +0 -0
  149. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_constants.py +0 -0
  150. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_create_crew.py +0 -0
  151. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_create_flow.py +0 -0
  152. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_crew_run_tui.py +0 -0
  153. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_crew_test.py +0 -0
  154. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_flow_commands.py +0 -0
  155. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_git.py +0 -0
  156. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_install_crew.py +0 -0
  157. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_kickoff_flow.py +0 -0
  158. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_plus_api.py +0 -0
  159. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_settings_command.py +0 -0
  160. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_token_manager.py +0 -0
  161. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_train_crew.py +0 -0
  162. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_utils.py +0 -0
  163. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_version.py +0 -0
  164. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/tools/__init__.py +0 -0
  165. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/tools/test_main.py +0 -0
  166. {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/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.15.2a2.dev20260707
3
+ Version: 1.15.2.dev20260710
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.15.2a2.dev20260707
13
+ Requires-Dist: crewai-core==1.15.2.dev20260710
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.15.2a2.dev20260707",
11
+ "crewai-core==1.15.2.dev20260710",
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.15.2.dev20260710"
@@ -526,8 +526,8 @@ def run(
526
526
  inputs: str | None,
527
527
  ) -> None:
528
528
  """Run the Crew or Flow."""
529
- if inputs is not None and definition is None:
530
- raise click.UsageError("--inputs requires --definition")
529
+ # --inputs no longer requires --definition: with no override it resolves the
530
+ # configured [tool.crewai] flow, same as a bare `crewai run`.
531
531
  if trained_agents_file is not None and definition is not None:
532
532
  raise click.UsageError("--filename can only be used when running crews")
533
533
 
@@ -0,0 +1,84 @@
1
+ """Shared interactive prompting for runtime inputs (flows and crews).
2
+
3
+ ``crewai run`` asks the user for values that were not provided up front — for a
4
+ declarative flow (derived from its state schema) and for a declarative (JSON)
5
+ crew (derived from the ``{placeholder}`` references in its agents and tasks).
6
+ Both paths go through this module so the experience is identical: the same
7
+ header, the same per-field prompt styling, and prompt chrome on stderr so
8
+ stdout carries only the run's result.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from collections.abc import Callable, Iterable
14
+ import difflib
15
+ import json
16
+ import sys
17
+ from typing import Any
18
+
19
+ import click
20
+
21
+ from crewai_cli.utils import enable_prompt_line_editing, is_dmn_mode_enabled
22
+
23
+
24
+ def parse_inputs_json(inputs: str | None) -> dict[str, Any] | None:
25
+ """Parse a ``--inputs`` JSON object, exiting with a pointed error if invalid."""
26
+ if inputs is None:
27
+ return None
28
+
29
+ try:
30
+ parsed = json.loads(inputs)
31
+ except json.JSONDecodeError as exc:
32
+ click.echo(f"Invalid --inputs JSON: {exc}", err=True)
33
+ raise SystemExit(1) from exc
34
+
35
+ if not isinstance(parsed, dict):
36
+ click.echo("Invalid --inputs JSON: expected an object.", err=True)
37
+ raise SystemExit(1)
38
+
39
+ return parsed
40
+
41
+
42
+ def closest_name(key: str, candidates: Iterable[str]) -> str | None:
43
+ """Nearest candidate name to a likely typo, if one is close enough."""
44
+ matches = difflib.get_close_matches(key, list(candidates), n=1, cutoff=0.7)
45
+ return matches[0] if matches else None
46
+
47
+
48
+ def is_interactive() -> bool:
49
+ """Prompt only in an interactive terminal, never in non-interactive mode."""
50
+ return not is_dmn_mode_enabled() and sys.stdin.isatty()
51
+
52
+
53
+ def prompt_for_inputs(
54
+ names: list[str],
55
+ *,
56
+ title: str,
57
+ subtitle: str,
58
+ describe: Callable[[str], str | None] | None = None,
59
+ coerce: Callable[[str, str], Any] | None = None,
60
+ ) -> dict[str, Any]:
61
+ """Prompt for each name and return ``{name: value}``.
62
+
63
+ ``describe(name)`` returns an optional hint shown dim above the prompt (used
64
+ by flows to surface a field's schema description). ``coerce(name, raw)``
65
+ converts the typed string to the stored value (used by flows to coerce to
66
+ the field's JSON-schema type); by default the raw string is kept as-is.
67
+
68
+ Prompt chrome is written to stderr so stdout carries only the run result.
69
+ """
70
+ enable_prompt_line_editing()
71
+ click.echo(err=True)
72
+ click.secho(f" {title}", fg="cyan", bold=True, err=True)
73
+ click.secho(f" {subtitle}", dim=True, err=True)
74
+
75
+ collected: dict[str, Any] = {}
76
+ for name in names:
77
+ if describe is not None and (hint := describe(name)):
78
+ click.secho(f" {hint}", dim=True, err=True)
79
+ raw = click.prompt(
80
+ click.style(f" {name}", fg="cyan"),
81
+ prompt_suffix=click.style(" > ", fg="bright_white"),
82
+ )
83
+ collected[name] = coerce(name, raw) if coerce is not None else raw
84
+ return collected
@@ -24,6 +24,7 @@ from __future__ import annotations
24
24
 
25
25
  from collections.abc import Callable
26
26
  import contextlib
27
+ import hashlib
27
28
  import json
28
29
  import os
29
30
  from pathlib import Path
@@ -45,8 +46,11 @@ MAX_MODELS = 8
45
46
  #: Timeout (seconds) for any network call made while resolving models.
46
47
  _TIMEOUT = 6.0
47
48
 
48
- #: How long a resolved (dynamic) catalog stays fresh before we refetch.
49
- _CATALOG_TTL = 6 * 3600
49
+ #: How long a resolved (dynamic) catalog stays fresh before we refetch. Kept
50
+ #: short: it only spares the picker repeated fetches within a wizard session,
51
+ #: and a stale list (new/removed models, account changes) is worse than a ~1s
52
+ #: refetch. Local providers (Ollama) are not cached at all — see _is_cacheable.
53
+ _CATALOG_TTL = 300
50
54
 
51
55
  #: How long a fallback result is cached after a failed/empty fetch. Short, so a
52
56
  #: newly-added API key takes effect soon, but long enough to spare the picker a
@@ -171,9 +175,8 @@ def get_provider_models(
171
175
 
172
176
  # Nothing fresher than the curated list. Cache it briefly (negative cache)
173
177
  # so a failed vendor/LiteLLM fetch isn't retried on every subsequent call.
174
- # Skip Ollama: it's a local, fast-failing server, so re-probing is cheap and
175
- # avoids serving suggestions after the server comes up within the TTL.
176
- if fallback and provider_key != "ollama":
178
+ # (_write_catalog_cache skips non-cacheable providers like Ollama.)
179
+ if fallback:
177
180
  _write_catalog_cache(provider_key, fallback, source="fallback")
178
181
  return fallback
179
182
 
@@ -601,25 +604,36 @@ def _litellm_cache_file() -> Path:
601
604
  return _cache_dir() / "provider_cache.json"
602
605
 
603
606
 
607
+ def _is_cacheable(provider_key: str) -> bool:
608
+ """Whether a provider's resolved catalog may be cached.
609
+
610
+ Ollama is a local server (``/api/tags`` is fast), and its installed models
611
+ change out-of-band, so it is never cached — the picker re-probes every call
612
+ and always reflects what is currently installed.
613
+ """
614
+ return provider_key != "ollama"
615
+
616
+
604
617
  def _cache_key(provider_key: str) -> str:
605
618
  """Cache key for a provider's resolved model list.
606
619
 
607
- Includes the inputs that change what a fetch would return, so a cached
608
- entry is only reused when those inputs still match:
609
-
610
- - Ollama lists models from a base URL that can change between runs.
611
- - Whether the vendor's API key is present flips between a live fetch and
612
- the negatively-cached fallback — so a key added after a no-key call is
613
- not shadowed by the cached fallback.
620
+ Keyed by the exact API key (via a short, non-reversible digest never the
621
+ key itself), so switching to a different key for the same provider misses
622
+ the previous account's cached entry and refetches. Absent key -> ``#nokey``,
623
+ which also keeps a negatively-cached no-key fallback from shadowing a run
624
+ after a key is added.
614
625
  """
615
- if provider_key == "ollama":
616
- return f"ollama@{_ollama_base()}"
617
- suffix = "key" if _provider_api_key(provider_key) else "nokey"
618
- return f"{provider_key}#{suffix}"
626
+ api_key = _provider_api_key(provider_key)
627
+ if not api_key:
628
+ return f"{provider_key}#nokey"
629
+ digest = hashlib.sha256(api_key.encode("utf-8")).hexdigest()[:12]
630
+ return f"{provider_key}#{digest}"
619
631
 
620
632
 
621
633
  def _read_catalog_cache(provider_key: str) -> list[tuple[str, str]] | None:
622
634
  """Return a fresh cached catalog for ``provider_key``, or ``None``."""
635
+ if not _is_cacheable(provider_key):
636
+ return None
623
637
  payload = _read_json(_catalog_cache_file())
624
638
  if not isinstance(payload, dict):
625
639
  return None
@@ -642,6 +656,8 @@ def _read_catalog_cache(provider_key: str) -> list[tuple[str, str]] | None:
642
656
  def _write_catalog_cache(
643
657
  provider_key: str, models: list[tuple[str, str]], *, source: str
644
658
  ) -> None:
659
+ if not _is_cacheable(provider_key):
660
+ return
645
661
  cache_file = _catalog_cache_file()
646
662
  payload = _read_json(cache_file)
647
663
  if not isinstance(payload, dict):
@@ -12,9 +12,14 @@ import click
12
12
  from crewai_core.constants import CREWAI_TRAINED_AGENTS_FILE_ENV
13
13
  from packaging import version
14
14
 
15
+ from crewai_cli.input_prompt import (
16
+ closest_name,
17
+ is_interactive,
18
+ parse_inputs_json,
19
+ prompt_for_inputs,
20
+ )
15
21
  from crewai_cli.utils import (
16
22
  build_env_with_all_tool_credentials,
17
- enable_prompt_line_editing,
18
23
  is_dmn_mode_enabled,
19
24
  )
20
25
  from crewai_cli.version import get_crewai_tools_dependency, get_crewai_version
@@ -31,6 +36,7 @@ _INPUT_PLACEHOLDER_RE = re.compile(r"(?<!{){([A-Za-z_][A-Za-z0-9_\-]*)}(?!})")
31
36
  _CREWAI_CLI_RUNNER_PACKAGE_DIR_ENV = "CREWAI_CLI_RUNNER_PACKAGE_DIR"
32
37
  _CREWAI_RUNNER_SOURCE_DIR_ENV = "CREWAI_RUNNER_SOURCE_DIR"
33
38
  _CREWAI_JSON_CREW_DEFINITION_ENV = "CREWAI_JSON_CREW_DEFINITION"
39
+ _CREWAI_JSON_CREW_INPUTS_ENV = "CREWAI_JSON_CREW_INPUTS"
34
40
  _FULL_CREWAI_INSTALL_MESSAGE = f"""\
35
41
  CrewAI CLI is installed without the `crewai` package required to run crews.
36
42
 
@@ -79,6 +85,8 @@ kwargs = {
79
85
  }
80
86
  if crew_definition := os.getenv("CREWAI_JSON_CREW_DEFINITION"):
81
87
  kwargs["crew_path"] = crew_definition
88
+ if crew_inputs := os.getenv("CREWAI_JSON_CREW_INPUTS"):
89
+ kwargs["inputs"] = crew_inputs
82
90
 
83
91
  try:
84
92
  module._run_json_crew(**kwargs)
@@ -138,8 +146,8 @@ def _extract_input_placeholders(text: str | None) -> set[str]:
138
146
  return set(_INPUT_PLACEHOLDER_RE.findall(text))
139
147
 
140
148
 
141
- def _missing_input_names(crew: Any, inputs: dict[str, Any]) -> list[str]:
142
- """Return input placeholders used by a crew but not provided as defaults."""
149
+ def _referenced_input_names(crew: Any) -> set[str]:
150
+ """All ``{placeholder}`` names referenced by a crew's agents and tasks."""
143
151
  placeholders: set[str] = set()
144
152
 
145
153
  for agent in getattr(crew, "agents", []) or []:
@@ -160,32 +168,70 @@ def _missing_input_names(crew: Any, inputs: dict[str, Any]) -> list[str]:
160
168
  _extract_input_placeholders(getattr(task, "output_file", None))
161
169
  )
162
170
 
163
- return sorted(name for name in placeholders if name not in inputs)
171
+ return placeholders
172
+
173
+
174
+ def _missing_input_names(crew: Any, inputs: dict[str, Any]) -> list[str]:
175
+ """Return input placeholders referenced by a crew but not provided as inputs."""
176
+ return sorted(name for name in _referenced_input_names(crew) if name not in inputs)
164
177
 
165
178
 
166
- def _prompt_for_missing_inputs(
167
- crew: Any, default_inputs: dict[str, Any]
179
+ def _resolve_crew_inputs(
180
+ crew: Any,
181
+ default_inputs: dict[str, Any],
182
+ provided: dict[str, Any] | None,
183
+ *,
184
+ interactive: bool,
168
185
  ) -> dict[str, Any]:
169
- """Ask for runtime values for placeholders that lack default inputs."""
186
+ """Resolve kickoff inputs for a declarative crew.
187
+
188
+ Mirrors the declarative-flow experience (``_resolve_flow_inputs``): layers
189
+ ``--inputs`` over the crew's declared ``inputs`` defaults, warns on provided
190
+ keys that aren't referenced as ``{placeholder}``s, prompts for any
191
+ still-missing placeholders when interactive, and exits with a pointed
192
+ message when one is still missing.
193
+
194
+ Unlike flows — whose state schema is an authoritative contract, so unknown
195
+ keys are dropped — the crew placeholder scan is heuristic (it only covers
196
+ agent/task text fields). An unrecognized key is therefore warned about but
197
+ *kept*, never dropped: dropping could silently discard a value that a field
198
+ the scan doesn't cover actually relies on.
199
+ """
200
+ referenced = _referenced_input_names(crew)
170
201
  inputs = dict(default_inputs or {})
171
- missing = _missing_input_names(crew, inputs)
172
- if not missing:
173
- return inputs
174
202
 
175
- enable_prompt_line_editing()
203
+ for key, value in (provided or {}).items():
204
+ if key not in referenced:
205
+ suggestion = closest_name(key, referenced)
206
+ hint = f" Did you mean '{suggestion}'?" if suggestion else ""
207
+ click.secho(
208
+ f" Input '{key}' isn't referenced by any {{placeholder}} "
209
+ f"in the crew.{hint}",
210
+ fg="yellow",
211
+ err=True,
212
+ )
213
+ inputs[key] = value
176
214
 
177
- click.echo()
178
- click.secho(" Runtime inputs", fg="cyan", bold=True)
179
- click.secho(
180
- " Values for {placeholder} references in your agents and tasks.",
181
- dim=True,
182
- )
215
+ missing = _missing_input_names(crew, inputs)
216
+ if missing and interactive:
217
+ inputs.update(
218
+ prompt_for_inputs(
219
+ missing,
220
+ title="Crew inputs",
221
+ subtitle="This crew needs the following to run.",
222
+ )
223
+ )
224
+ missing = _missing_input_names(crew, inputs)
183
225
 
184
- for name in missing:
185
- inputs[name] = click.prompt(
186
- click.style(f" {name}", fg="cyan"),
187
- prompt_suffix=click.style(" > ", fg="bright_white"),
226
+ if missing:
227
+ for name in missing:
228
+ click.secho(f" Missing required input '{name}'", fg="red", err=True)
229
+ click.secho(
230
+ " Provide them via --inputs or the `inputs` object in crew.json(c).",
231
+ dim=True,
232
+ err=True,
188
233
  )
234
+ raise SystemExit(1)
189
235
 
190
236
  return inputs
191
237
 
@@ -243,29 +289,14 @@ def _prepare_json_crew_for_tui(crew: Any) -> None:
243
289
  agent.llm.stream = True
244
290
 
245
291
 
246
- def _runtime_inputs_without_prompt(
247
- crew: Any, default_inputs: dict[str, Any]
248
- ) -> dict[str, Any]:
249
- """Return runtime inputs in non-interactive mode or exit on missing values."""
250
- inputs = dict(default_inputs or {})
251
- missing = _missing_input_names(crew, inputs)
252
- if missing:
253
- missing_list = ", ".join(missing)
254
- click.echo(
255
- "Missing runtime inputs for CREWAI_DMN mode: "
256
- f"{missing_list}. Add them to the `inputs` object in crew.json(c).",
257
- err=True,
258
- )
259
- raise SystemExit(1)
260
- return inputs
261
-
262
-
263
- def _run_json_crew_without_tui(crew_path: Path) -> Any:
292
+ def _run_json_crew_without_tui(crew_path: Path, provided: dict[str, Any] | None) -> Any:
264
293
  """Run a JSON-defined crew with plain terminal output."""
265
294
  with _json_loading_status("Preparing crew..."):
266
295
  crew, default_inputs = _load_json_crew(crew_path)
267
296
 
268
- runtime_inputs = _runtime_inputs_without_prompt(crew, default_inputs)
297
+ runtime_inputs = _resolve_crew_inputs(
298
+ crew, default_inputs, provided, interactive=False
299
+ )
269
300
  result = crew.kickoff(inputs=runtime_inputs)
270
301
  if result is not None:
271
302
  click.echo(str(result))
@@ -275,6 +306,7 @@ def _run_json_crew_without_tui(crew_path: Path) -> Any:
275
306
  def _run_json_crew(
276
307
  trained_agents_file: str | None = None,
277
308
  crew_path: str | Path | None = None,
309
+ inputs: str | None = None,
278
310
  ) -> Any:
279
311
  """Load and run a JSON-defined crew."""
280
312
  from dotenv import load_dotenv
@@ -296,13 +328,17 @@ def _run_json_crew(
296
328
  )
297
329
  crew_path = Path(crew_path)
298
330
 
331
+ provided = parse_inputs_json(inputs)
332
+
299
333
  if is_dmn_mode_enabled():
300
- return _run_json_crew_without_tui(crew_path)
334
+ return _run_json_crew_without_tui(crew_path, provided)
301
335
 
302
336
  crew_run_app_cls, crew, default_inputs, task_names, agent_names = (
303
337
  _load_json_crew_for_tui(crew_path)
304
338
  )
305
- runtime_inputs = _prompt_for_missing_inputs(crew, default_inputs)
339
+ runtime_inputs = _resolve_crew_inputs(
340
+ crew, default_inputs, provided, interactive=is_interactive()
341
+ )
306
342
 
307
343
  app = crew_run_app_cls(
308
344
  crew_name=crew.name or "Crew",
@@ -411,12 +447,18 @@ def _json_crew_run_command(project_root: Path | None = None) -> list[str]:
411
447
  def _run_json_crew_in_project_env(
412
448
  trained_agents_file: str | None = None,
413
449
  crew_path: str | Path | None = None,
450
+ inputs: str | None = None,
414
451
  ) -> Any:
415
452
  """Run JSON crews from the project's uv-managed environment."""
453
+ # Validate --inputs up front so bad JSON fails before we spin up the uv env.
454
+ if inputs is not None:
455
+ parse_inputs_json(inputs)
456
+
416
457
  if not (Path.cwd() / "pyproject.toml").is_file():
417
458
  return _run_json_crew(
418
459
  trained_agents_file=trained_agents_file,
419
460
  crew_path=crew_path,
461
+ inputs=inputs,
420
462
  )
421
463
 
422
464
  _install_json_crew_dependencies_if_needed()
@@ -430,6 +472,8 @@ def _run_json_crew_in_project_env(
430
472
  env[CREWAI_TRAINED_AGENTS_FILE_ENV] = trained_agents_file
431
473
  if crew_path is not None:
432
474
  env[_CREWAI_JSON_CREW_DEFINITION_ENV] = str(crew_path)
475
+ if inputs is not None:
476
+ env[_CREWAI_JSON_CREW_INPUTS_ENV] = inputs
433
477
 
434
478
  try:
435
479
  subprocess.run( # noqa: S603
@@ -569,11 +613,11 @@ def run_crew(
569
613
  ``CREWAI_TRAINED_AGENTS_FILE`` so agents load suggestions from this
570
614
  file instead of the default ``trained_agents_data.pkl``.
571
615
  definition: Optional path to a declarative Flow definition.
572
- inputs: Optional JSON object passed to a declarative Flow.
616
+ inputs: Optional JSON object of runtime inputs for a declarative flow
617
+ or declarative (JSON) crew. Layered over the definition's own
618
+ defaults; missing required values are prompted for interactively.
573
619
  """
574
- if inputs is not None and definition is None:
575
- raise click.UsageError("--inputs requires --definition")
576
-
620
+ # --definition is a pure override: run that flow directly.
577
621
  if definition is not None:
578
622
  _run_explicit_declarative_flow(
579
623
  definition=definition,
@@ -584,9 +628,13 @@ def run_crew(
584
628
 
585
629
  pyproject_data = read_toml()
586
630
  if json_crew_definition := configured_project_json_crew(pyproject_data):
631
+ # Declarative (JSON) crews resolve inputs the same way flows do: --inputs
632
+ # layers over the crew's declared defaults, missing {placeholder}s are
633
+ # prompted for, and unknown keys are flagged. Forward the raw JSON.
587
634
  _run_json_crew_in_project_env(
588
635
  trained_agents_file=trained_agents_file,
589
636
  crew_path=json_crew_definition,
637
+ inputs=inputs,
590
638
  )
591
639
  return
592
640
 
@@ -594,18 +642,29 @@ def run_crew(
594
642
  project_type = get_crewai_project_type(pyproject_data)
595
643
 
596
644
  if project_type == "flow":
645
+ # No --definition: resolve the configured [tool.crewai] flow — the same
646
+ # resolution as a bare `crewai run` — and pass --inputs straight through.
597
647
  _run_flow_project(
598
648
  pyproject_data=pyproject_data,
599
649
  trained_agents_file=trained_agents_file,
650
+ inputs=inputs,
600
651
  )
601
652
  return
602
653
 
654
+ _reject_inputs_for_non_flow(inputs)
603
655
  _run_classic_crew_project(
604
656
  pyproject_data=pyproject_data,
605
657
  trained_agents_file=trained_agents_file,
606
658
  )
607
659
 
608
660
 
661
+ def _reject_inputs_for_non_flow(inputs: str | None) -> None:
662
+ if inputs is not None:
663
+ raise click.UsageError(
664
+ "--inputs is only supported for declarative flows and crews"
665
+ )
666
+
667
+
609
668
  def _run_explicit_declarative_flow(
610
669
  definition: str, inputs: str | None, trained_agents_file: str | None
611
670
  ) -> None:
@@ -618,7 +677,9 @@ def _run_explicit_declarative_flow(
618
677
 
619
678
 
620
679
  def _run_flow_project(
621
- pyproject_data: dict[str, Any], trained_agents_file: str | None
680
+ pyproject_data: dict[str, Any],
681
+ trained_agents_file: str | None,
682
+ inputs: str | None = None,
622
683
  ) -> None:
623
684
  if trained_agents_file is not None:
624
685
  raise click.UsageError("--filename can only be used when running crews")
@@ -629,9 +690,16 @@ def _run_flow_project(
629
690
  )
630
691
 
631
692
  if definition := configured_project_declarative_flow(pyproject_data):
632
- run_declarative_flow_in_project_env(definition=definition)
693
+ run_declarative_flow_in_project_env(definition=definition, inputs=inputs)
633
694
  return
634
695
 
696
+ # No configured declarative flow definition to resolve inputs against.
697
+ if inputs is not None:
698
+ raise click.UsageError(
699
+ "--inputs requires a declarative flow definition "
700
+ "([tool.crewai].definition) or --definition"
701
+ )
702
+
635
703
  from crewai_cli.kickoff_flow import (
636
704
  _load_conversational_flow_from_kickoff_script,
637
705
  _run_conversational_flow_tui,