Skip to content

Plugins

CADDForge tools are discovered as plugins. The core package defines the interfaces; tool packages register implementations.

Plugin packages typically provide:

  • a validated config class
  • a workflow class
  • a Tool implementation
  • Python entry points under caddforge.tools
  • optional GUI extensions
  • optional pipeline input and output ports

Example entry point group:

[project.entry-points."caddforge.tools"]
docking-unidock = "cadd_docking.tool:UniDockTool"

The core CLI uses these entry points to resolve commands such as:

caddforge run docking unidock --config unidock.yaml

Python automation should use the same plugin contract instead of importing tool-internal config and workflow classes directly:

from caddforge.core.execution import load_result_for_job, submit_workflow
from caddforge.plugins import get_tool

spec = get_tool("docking", "unidock")
cfg = spec.config_cls.from_yaml("unidock.yaml")
workflow = spec.workflow_cls(cfg)

job = submit_workflow(
    workflow, cfg, backend_name=cfg.backend,
    input_ports=tuple(getattr(spec.plugin, "input_ports", ())),
)
result = load_result_for_job(job)

Forward spec.plugin.input_ports to submission so core can stage declared compressed inputs before the scientific workflow runs. The CLI and pipeline executor already forward these contracts. Keep original compressed paths in the submitted configuration; core manages temporary expanded files.

Core code must not hardcode specific tool names.