Skip to content

ccproxy.core.plugins.cli_discovery

ccproxy.core.plugins.cli_discovery

Lightweight CLI discovery for plugin command registration.

This module provides minimal plugin discovery specifically for CLI command registration, loading only plugin manifests without full initialization.

discover_plugin_cli_extensions

discover_plugin_cli_extensions(settings=None)

Lightweight discovery of plugin CLI extensions.

Only loads plugin factories and manifests, no runtime initialization. Used during CLI app creation to register plugin commands/arguments.

Parameters:

Name Type Description Default
settings Any | None

Optional settings object to filter plugins

None

Returns:

Type Description
list[tuple[str, PluginManifest]]

List of (plugin_name, manifest) tuples for plugins with CLI extensions.

Source code in ccproxy/core/plugins/cli_discovery.py
def discover_plugin_cli_extensions(
    settings: Any | None = None,
) -> list[tuple[str, PluginManifest]]:
    """Lightweight discovery of plugin CLI extensions.

    Only loads plugin factories and manifests, no runtime initialization.
    Used during CLI app creation to register plugin commands/arguments.

    Args:
        settings: Optional settings object to filter plugins

    Returns:
        List of (plugin_name, manifest) tuples for plugins with CLI extensions.
    """
    plugin_manifests = []

    # Discover from filesystem (plugins/ directory)
    try:
        filesystem_manifests = _discover_filesystem_cli_extensions()
        plugin_manifests.extend(filesystem_manifests)
    except Exception as e:
        logger.debug("filesystem_cli_discovery_failed", error=str(e))

    # Discover from entry points
    try:
        entry_point_manifests = _discover_entry_point_cli_extensions()
        plugin_manifests.extend(entry_point_manifests)
    except Exception as e:
        logger.debug("entry_point_cli_discovery_failed", error=str(e))

    # Remove duplicates (filesystem takes precedence)
    seen_names = set()
    unique_manifests = []
    for name, manifest in plugin_manifests:
        if name not in seen_names:
            unique_manifests.append((name, manifest))
            seen_names.add(name)

    # Apply plugin filtering if settings provided
    if settings is not None:
        combined_denylist = build_combined_plugin_denylist(
            getattr(settings, "disabled_plugins", None),
            getattr(settings, "plugins", None),
        )

        plugin_filter = PluginFilter(
            enabled_plugins=getattr(settings, "enabled_plugins", None),
            disabled_plugins=combined_denylist,
        )

        filtered_manifests = []
        for name, manifest in unique_manifests:
            if plugin_filter.is_enabled(name):
                filtered_manifests.append((name, manifest))
            else:
                logger.debug(
                    "plugin_cli_extension_disabled", plugin=name, category="plugin"
                )

        return filtered_manifests

    return unique_manifests