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.
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/PKG-INFO +2 -2
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/pyproject.toml +1 -1
- crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/__init__.py +1 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/cli.py +24 -28
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/create_flow.py +53 -2
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/create_json_crew.py +1 -1
- crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/deploy/archive.py +143 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/deploy/validate.py +26 -6
- crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/plot_flow.py +31 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/run_crew.py +92 -25
- crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/run_declarative_flow.py +212 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/AGENTS.md +1 -1
- crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/templates/declarative_flow/.gitignore +5 -0
- crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/templates/declarative_flow/README.md +17 -0
- crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/templates/declarative_flow/flow.yaml +15 -0
- crewai_cli-1.14.8a2.dev20260623/src/crewai_cli/templates/declarative_flow/pyproject.toml +20 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/deploy/test_archive.py +66 -32
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/deploy/test_validate.py +35 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_cli.py +67 -12
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_create_crew.py +19 -1
- crewai_cli-1.14.8a2.dev20260623/tests/test_create_flow.py +35 -0
- crewai_cli-1.14.8a2.dev20260623/tests/test_flow_commands.py +117 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_run_crew.py +128 -0
- crewai_cli-1.14.8a2.dev20260623/tests/test_run_declarative_flow.py +111 -0
- crewai_cli-1.14.8a2.dev20260619/src/crewai_cli/__init__.py +0 -1
- crewai_cli-1.14.8a2.dev20260619/src/crewai_cli/deploy/archive.py +0 -409
- crewai_cli-1.14.8a2.dev20260619/src/crewai_cli/kickoff_flow.py +0 -23
- crewai_cli-1.14.8a2.dev20260619/src/crewai_cli/plot_flow.py +0 -23
- crewai_cli-1.14.8a2.dev20260619/src/crewai_cli/run_flow_definition.py +0 -113
- crewai_cli-1.14.8a2.dev20260619/tests/test_run_flow_definition.py +0 -156
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/.gitignore +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/README.md +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/add_crew_to_flow.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/constants.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/providers/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/providers/auth0.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/providers/base_provider.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/providers/entra_id.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/providers/keycloak.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/providers/okta.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/providers/workos.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/token.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/authentication/utils.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/checkpoint_cli.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/checkpoint_tui.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/command.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/config.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/constants.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/create_crew.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/crew_chat.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/crew_run_tui.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/deploy/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/deploy/main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/enterprise/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/enterprise/main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/evaluate_crew.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/experimental/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/experimental/skills/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/experimental/skills/main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/git.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/install_crew.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/memory_tui.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/organization/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/organization/main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/plus_api.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/provider.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/py.typed +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/remote_template/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/remote_template/main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/replay_from_task.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/reset_memories_command.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/settings/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/settings/main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/shared/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/shared/token_manager.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/task_outputs.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/.gitignore +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/README.md +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/config/agents.yaml +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/config/tasks.yaml +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/crew.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/knowledge/user_preference.txt +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/pyproject.toml +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/skills/.gitkeep +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/tools/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/crew/tools/custom_tool.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/.gitignore +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/README.md +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/__init__.py +0 -0
- {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
- {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
- {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
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/pyproject.toml +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/skills/.gitkeep +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/tools/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/flow/tools/custom_tool.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/tool/.gitignore +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/tool/README.md +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/tool/pyproject.toml +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/tool/src/{{folder_name}}/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/templates/tool/src/{{folder_name}}/tool.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/tools/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/tools/main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/train_crew.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/triggers/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/triggers/main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/tui_picker.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/update_crew.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/user_data.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/utils.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/version.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/providers/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/providers/test_auth0.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/providers/test_entra_id.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/providers/test_keycloak.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/providers/test_okta.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/providers/test_workos.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/test_auth_main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/authentication/test_utils.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/deploy/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/deploy/test_deploy_main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/enterprise/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/enterprise/test_main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/experimental/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/experimental/skills/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/experimental/skills/test_main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/organization/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/organization/test_main.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/skills/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_click_compatibility.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_config.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_constants.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_crew_run_tui.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_crew_test.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_git.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_install_crew.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_plus_api.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_settings_command.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_token_manager.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_train_crew.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_utils.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/test_version.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/tools/__init__.py +0 -0
- {crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/tests/tools/test_main.py +0 -0
- {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.
|
|
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.
|
|
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
|
|
@@ -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
|
-
"
|
|
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='
|
|
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
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
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
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
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")
|
{crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/create_flow.py
RENAMED
|
@@ -5,7 +5,10 @@ import click
|
|
|
5
5
|
from crewai_core.telemetry import Telemetry
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
|
|
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
|
-
|
|
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")
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
{crewai_cli-1.14.8a2.dev20260619 → crewai_cli-1.14.8a2.dev20260623}/src/crewai_cli/run_crew.py
RENAMED
|
@@ -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(
|
|
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
|
-
|
|
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
|
|
576
|
-
|
|
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
|
|
645
|
+
"""Execute a project script through uv.
|
|
579
646
|
|
|
580
647
|
Args:
|
|
581
|
-
|
|
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",
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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:
|