chore(core): address bot findings on extraction follow-up

- Add __all__ to all re-export shims (crewai.{settings,constants,utilities.{
  version,paths,printer,lock_store,constants,project_utils},auth.token_manager,
  events.utils.console_formatter}, crewai_cli.{config,shared.token_manager},
  crewai_cli.utils) to silence CodeQL "unused import" findings — the imports
  are the module's public API.
- Migrate three CLI internal callers (cli.py, authentication/main.py,
  authentication/token.py) off the deprecated crewai_cli.shared.token_manager
  shim, importing crewai_core.token_manager directly. Avoids a self-imposed
  DeprecationWarning on every CLI startup.
- Add Telemetry._safe_telemetry_procedure for void operations; switch the
  CLI-facing span methods (deploy/template/flow_creation/signup, _add_attribute)
  off _safe_telemetry_operation since they don't return a span.
- Delete unused crewai_cli.utils.update_env_vars (had a latent type-cast bug
  and zero callers).
This commit is contained in:
Greyson Lalonde
2026-05-05 20:59:42 +08:00
parent fb045534aa
commit 832fdb7c5d
17 changed files with 136 additions and 49 deletions

View File

@@ -2,13 +2,13 @@ import time
from typing import TYPE_CHECKING, Any, TypeVar, cast from typing import TYPE_CHECKING, Any, TypeVar, cast
import webbrowser import webbrowser
from crewai_core.token_manager import TokenManager
import httpx import httpx
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from rich.console import Console from rich.console import Console
from crewai_cli.authentication.utils import validate_jwt_token from crewai_cli.authentication.utils import validate_jwt_token
from crewai_cli.config import Settings from crewai_cli.config import Settings
from crewai_cli.shared.token_manager import TokenManager
console = Console() console = Console()

View File

@@ -1,4 +1,4 @@
from crewai_cli.shared.token_manager import TokenManager from crewai_core.token_manager import TokenManager
class AuthError(Exception): class AuthError(Exception):

View File

@@ -6,6 +6,7 @@ import subprocess
from typing import Any from typing import Any
import click import click
from crewai_core.token_manager import TokenManager
from crewai_cli.add_crew_to_flow import add_crew_to_flow from crewai_cli.add_crew_to_flow import add_crew_to_flow
from crewai_cli.authentication.main import AuthenticationCommand from crewai_cli.authentication.main import AuthenticationCommand
@@ -25,7 +26,6 @@ from crewai_cli.replay_from_task import replay_task_command
from crewai_cli.reset_memories_command import reset_memories_command from crewai_cli.reset_memories_command import reset_memories_command
from crewai_cli.run_crew import run_crew from crewai_cli.run_crew import run_crew
from crewai_cli.settings.main import SettingsCommand from crewai_cli.settings.main import SettingsCommand
from crewai_cli.shared.token_manager import TokenManager
from crewai_cli.task_outputs import load_task_outputs from crewai_cli.task_outputs import load_task_outputs
from crewai_cli.tools.main import ToolCommand from crewai_cli.tools.main import ToolCommand
from crewai_cli.train_crew import train_crew from crewai_cli.train_crew import train_crew

View File

@@ -16,3 +16,15 @@ from crewai_core.settings import (
Settings as Settings, Settings as Settings,
get_writable_config_path as get_writable_config_path, get_writable_config_path as get_writable_config_path,
) )
__all__ = [
"CLI_SETTINGS_KEYS",
"DEFAULT_CLI_SETTINGS",
"DEFAULT_CONFIG_PATH",
"HIDDEN_SETTINGS_KEYS",
"READONLY_SETTINGS_KEYS",
"USER_SETTINGS_KEYS",
"Settings",
"get_writable_config_path",
]

View File

@@ -7,6 +7,9 @@ import warnings
from crewai_core.token_manager import TokenManager as TokenManager from crewai_core.token_manager import TokenManager as TokenManager
__all__ = ["TokenManager"]
warnings.warn( warnings.warn(
"crewai_cli.shared.token_manager is deprecated; " "crewai_cli.shared.token_manager is deprecated; "
"import from crewai_core.token_manager.", "import from crewai_core.token_manager.",

View File

@@ -3,7 +3,7 @@ from __future__ import annotations
import os import os
from pathlib import Path from pathlib import Path
import shutil import shutil
from typing import Any, cast from typing import Any
import click import click
from crewai_core.project import ( from crewai_core.project import (
@@ -21,7 +21,22 @@ from crewai_core.tool_credentials import (
) )
from rich.console import Console from rich.console import Console
from crewai_cli.constants import ENV_VARS
__all__ = [
"build_env_with_all_tool_credentials",
"build_env_with_tool_repository_credentials",
"copy_template",
"fetch_and_json_env_file",
"get_project_description",
"get_project_name",
"get_project_version",
"load_env_vars",
"parse_toml",
"read_toml",
"tree_copy",
"tree_find_and_replace",
"write_env_file",
]
console = Console() console = Console()
@@ -116,41 +131,6 @@ def load_env_vars(folder_path: Path) -> dict[str, Any]:
return env_vars return env_vars
def update_env_vars(
env_vars: dict[str, Any], provider: str, model: str
) -> dict[str, Any] | None:
"""Updates environment variables with the API key for the selected provider and model."""
provider_config = cast(
list[str],
ENV_VARS.get(
provider,
[
click.prompt(
f"Enter the environment variable name for your {provider.capitalize()} API key",
type=str,
)
],
),
)
api_key_var = provider_config[0]
if api_key_var not in env_vars:
try:
env_vars[api_key_var] = click.prompt(
f"Enter your {provider.capitalize()} API key", type=str, hide_input=True
)
except click.exceptions.Abort:
click.secho("Operation aborted by the user.", fg="red")
return None
else:
click.secho(f"API key already exists for {provider.capitalize()}.", fg="yellow")
env_vars["MODEL"] = model
click.secho(f"Selected model: {model}", fg="green")
return env_vars
def write_env_file(folder_path: Path, env_vars: dict[str, Any]) -> None: def write_env_file(folder_path: Path, env_vars: dict[str, Any]) -> None:
"""Writes environment variables to a .env file in the specified folder.""" """Writes environment variables to a .env file in the specified folder."""
env_file_path = folder_path / ".env" env_file_path = folder_path / ".env"

View File

@@ -159,6 +159,7 @@ class Telemetry:
def _safe_telemetry_operation( def _safe_telemetry_operation(
self, operation: Callable[[], Span | None] self, operation: Callable[[], Span | None]
) -> Span | None: ) -> Span | None:
"""Run a span-returning telemetry operation, swallowing failures."""
if not self._should_execute_telemetry(): if not self._should_execute_telemetry():
return None return None
try: try:
@@ -167,14 +168,23 @@ class Telemetry:
logger.debug("Telemetry operation failed: %s", e) logger.debug("Telemetry operation failed: %s", e)
return None return None
def _safe_telemetry_procedure(self, operation: Callable[[], None]) -> None:
"""Run a void telemetry procedure, swallowing failures."""
if not self._should_execute_telemetry():
return
try:
operation()
except Exception as e:
logger.debug("Telemetry operation failed: %s", e)
def _add_attribute(self, span: Span | None, key: str, value: Any) -> None: def _add_attribute(self, span: Span | None, key: str, value: Any) -> None:
if span is None: if span is None:
return return
def _operation() -> None: def _operation() -> None:
return span.set_attribute(key, value) span.set_attribute(key, value)
self._safe_telemetry_operation(_operation) self._safe_telemetry_procedure(_operation)
# --- CLI-facing spans --------------------------------------------------- # --- CLI-facing spans ---------------------------------------------------
@@ -186,7 +196,7 @@ class Telemetry:
span = tracer.start_span("Deploy Signup Error") span = tracer.start_span("Deploy Signup Error")
close_span(span) close_span(span)
self._safe_telemetry_operation(_operation) self._safe_telemetry_procedure(_operation)
def start_deployment_span(self, uuid: str | None = None) -> None: def start_deployment_span(self, uuid: str | None = None) -> None:
"""Records the start of a deployment process.""" """Records the start of a deployment process."""
@@ -198,7 +208,7 @@ class Telemetry:
self._add_attribute(span, "uuid", uuid) self._add_attribute(span, "uuid", uuid)
close_span(span) close_span(span)
self._safe_telemetry_operation(_operation) self._safe_telemetry_procedure(_operation)
def create_crew_deployment_span(self) -> None: def create_crew_deployment_span(self) -> None:
"""Records the creation of a new crew deployment.""" """Records the creation of a new crew deployment."""
@@ -208,7 +218,7 @@ class Telemetry:
span = tracer.start_span("Create Crew Deployment") span = tracer.start_span("Create Crew Deployment")
close_span(span) close_span(span)
self._safe_telemetry_operation(_operation) self._safe_telemetry_procedure(_operation)
def get_crew_logs_span( def get_crew_logs_span(
self, uuid: str | None, log_type: str = "deployment" self, uuid: str | None, log_type: str = "deployment"
@@ -223,7 +233,7 @@ class Telemetry:
self._add_attribute(span, "uuid", uuid) self._add_attribute(span, "uuid", uuid)
close_span(span) close_span(span)
self._safe_telemetry_operation(_operation) self._safe_telemetry_procedure(_operation)
def remove_crew_span(self, uuid: str | None = None) -> None: def remove_crew_span(self, uuid: str | None = None) -> None:
"""Records the removal of a crew.""" """Records the removal of a crew."""
@@ -235,7 +245,7 @@ class Telemetry:
self._add_attribute(span, "uuid", uuid) self._add_attribute(span, "uuid", uuid)
close_span(span) close_span(span)
self._safe_telemetry_operation(_operation) self._safe_telemetry_procedure(_operation)
def flow_creation_span(self, flow_name: str) -> None: def flow_creation_span(self, flow_name: str) -> None:
"""Records the creation of a new flow.""" """Records the creation of a new flow."""
@@ -246,7 +256,7 @@ class Telemetry:
self._add_attribute(span, "flow_name", flow_name) self._add_attribute(span, "flow_name", flow_name)
close_span(span) close_span(span)
self._safe_telemetry_operation(_operation) self._safe_telemetry_procedure(_operation)
def template_installed_span(self, template_name: str) -> None: def template_installed_span(self, template_name: str) -> None:
"""Records when a template is downloaded and installed.""" """Records when a template is downloaded and installed."""
@@ -259,4 +269,4 @@ class Telemetry:
self._add_attribute(span, "template_name", template_name) self._add_attribute(span, "template_name", template_name)
close_span(span) close_span(span)
self._safe_telemetry_operation(_operation) self._safe_telemetry_procedure(_operation)

View File

@@ -7,6 +7,9 @@ import warnings
from crewai_core.token_manager import TokenManager as TokenManager from crewai_core.token_manager import TokenManager as TokenManager
__all__ = ["TokenManager"]
warnings.warn( warnings.warn(
"crewai.auth.token_manager is deprecated; import from crewai_core.token_manager.", "crewai.auth.token_manager is deprecated; import from crewai_core.token_manager.",
DeprecationWarning, DeprecationWarning,

View File

@@ -11,6 +11,21 @@ from crewai_core.constants import (
) )
__all__ = [
"CREWAI_ENTERPRISE_DEFAULT_OAUTH2_AUDIENCE",
"CREWAI_ENTERPRISE_DEFAULT_OAUTH2_CLIENT_ID",
"CREWAI_ENTERPRISE_DEFAULT_OAUTH2_DOMAIN",
"CREWAI_ENTERPRISE_DEFAULT_OAUTH2_PROVIDER",
"DEFAULT_CREWAI_ENTERPRISE_URL",
"DEFAULT_LLM_MODEL",
"ENV_VARS",
"JSON_URL",
"LITELLM_PARAMS",
"MODELS",
"PROVIDERS",
]
ENV_VARS: dict[str, list[dict[str, Any]]] = { ENV_VARS: dict[str, list[dict[str, Any]]] = {
"openai": [ "openai": [
{ {

View File

@@ -15,6 +15,13 @@ from rich.text import Text
from crewai.version import is_current_version_yanked, is_newer_version_available from crewai.version import is_current_version_yanked, is_newer_version_available
__all__ = [
"ConsoleFormatter",
"set_suppress_console_output",
"should_suppress_console_output",
]
_disable_version_check: ContextVar[bool] = ContextVar( _disable_version_check: ContextVar[bool] = ContextVar(
"_disable_version_check", default=False "_disable_version_check", default=False
) )

View File

@@ -16,3 +16,15 @@ from crewai_core.settings import (
Settings as Settings, Settings as Settings,
get_writable_config_path as get_writable_config_path, get_writable_config_path as get_writable_config_path,
) )
__all__ = [
"CLI_SETTINGS_KEYS",
"DEFAULT_CLI_SETTINGS",
"DEFAULT_CONFIG_PATH",
"HIDDEN_SETTINGS_KEYS",
"READONLY_SETTINGS_KEYS",
"USER_SETTINGS_KEYS",
"Settings",
"get_writable_config_path",
]

View File

@@ -11,6 +11,20 @@ from crewai_core.printer import PrinterColor
from pydantic_core import CoreSchema from pydantic_core import CoreSchema
__all__ = [
"CC_ENV_VAR",
"CODEX_ENV_VARS",
"CREWAI_TRAINED_AGENTS_FILE_ENV",
"CURSOR_ENV_VARS",
"EMITTER_COLOR",
"KNOWLEDGE_DIRECTORY",
"MAX_FILE_NAME_LENGTH",
"NOT_SPECIFIED",
"TRAINED_AGENTS_DATA_FILE",
"TRAINING_DATA_FILE",
]
EMITTER_COLOR: Final[PrinterColor] = "bold_blue" EMITTER_COLOR: Final[PrinterColor] = "bold_blue"
CC_ENV_VAR: Final[str] = "CLAUDECODE" CC_ENV_VAR: Final[str] = "CLAUDECODE"
CODEX_ENV_VARS: Final[tuple[str, ...]] = ( CODEX_ENV_VARS: Final[tuple[str, ...]] = (

View File

@@ -7,6 +7,9 @@ import warnings
from crewai_core.lock_store import lock as lock from crewai_core.lock_store import lock as lock
__all__ = ["lock"]
warnings.warn( warnings.warn(
"crewai.utilities.lock_store is deprecated; import from crewai_core.lock_store.", "crewai.utilities.lock_store is deprecated; import from crewai_core.lock_store.",
DeprecationWarning, DeprecationWarning,

View File

@@ -10,6 +10,9 @@ from crewai_core.paths import (
) )
__all__ = ["db_storage_path", "get_project_directory_name"]
warnings.warn( warnings.warn(
"crewai.utilities.paths is deprecated; import from crewai_core.paths.", "crewai.utilities.paths is deprecated; import from crewai_core.paths.",
DeprecationWarning, DeprecationWarning,

View File

@@ -12,6 +12,9 @@ from crewai_core.printer import (
) )
__all__ = ["PRINTER", "ColoredText", "Printer", "PrinterColor"]
warnings.warn( warnings.warn(
"crewai.utilities.printer is deprecated; import from crewai_core.printer.", "crewai.utilities.printer is deprecated; import from crewai_core.printer.",
DeprecationWarning, DeprecationWarning,

View File

@@ -32,6 +32,25 @@ from crewai.crew import Crew
from crewai.flow import Flow from crewai.flow import Flow
__all__ = [
"build_env_with_all_tool_credentials",
"build_env_with_tool_repository_credentials",
"extract_available_exports",
"extract_tools_metadata",
"fetch_crews",
"get_crew_instance",
"get_crews",
"get_flow_instance",
"get_flows",
"get_project_description",
"get_project_name",
"get_project_version",
"is_valid_tool",
"parse_toml",
"read_toml",
]
console = Console() console = Console()

View File

@@ -7,6 +7,9 @@ import warnings
from crewai_core.version import get_crewai_version as get_crewai_version from crewai_core.version import get_crewai_version as get_crewai_version
__all__ = ["get_crewai_version"]
warnings.warn( warnings.warn(
"crewai.utilities.version is deprecated; import from crewai_core.version.", "crewai.utilities.version is deprecated; import from crewai_core.version.",
DeprecationWarning, DeprecationWarning,