Skip to main content

Plugin Ecosystem

A single plugin package can hook into three distinct integration points. Each is optional, discovered via its own entry-point group, and consumed by a different part of the system. See Plugin Architecture for the full authoring guide.

Integration points​

Integration pointHowWhere consumedOutput
Image building@image_plugin("name") + apply() / render()Image.to_spec() (image-builder)Dockerfile fragment
MCP upstreamget_mcp_upstream() on a PluginBase subclassImage.to_spec() (auto-writes config)/etc/idegym/mcp-upstreams.d/<name>.json
Server routing@server_plugin + get_server_router()server/main.py at startupAPIRouter mounted at /api/<plugin>/*
Client operationsidegym.plugins.client entry pointIdeGYMServer.__init__server.<plugin>.<method>()

All methods have no-op defaults, so a plugin only needs to implement the parts it uses.

Entry-point groups​

GroupLoaded byWhen
idegym.plugins.imageimage-builder (builder.py)At import time — registry populated before YAML deserialization
idegym.plugins.serverserver/main.pyAt module load — filtered by /etc/idegym/plugins.json
idegym.plugins.clientclient/server.py (IdeGYMServer.__init__)Per IdeGYMServer instance

/etc/idegym/plugins.json (written by the IdeGYMServer image plugin at build time) controls which server plugins are enabled at runtime. If the file is absent (development), all installed plugins are loaded.