New Features (2026-06-19) — Plugin SDK

A third-party pip package can now register new AC_* executor commands declaratively via a setuptools entry point in the je_auto_control.commands group — turning the monolith into an ecosystem (how pytest/Playwright grew). AutoControl discovers them at runtime; discovered commands are immediately usable from JSON action files, the socket server, the scheduler, and MCP. Pure standard library (importlib.metadata); full stack.

Authoring a plugin

A plugin package exposes an entry point whose target is a factory returning a {command_name: handler} mapping:

# in the plugin's pyproject.toml
[project.entry-points."je_auto_control.commands"]
my_pack = "my_pack.commands:provide"

# my_pack/commands.py
def provide():
    return {"AC_my_command": lambda **kw: {"ok": True}}

Discovering & loading

from je_auto_control import discover_plugins, load_plugins

discover_plugins()      # {command_name: handler} from all plugins
load_plugins()          # discover + register into the executor

Broken plugins are skipped (logged), not fatal. Exposed as AC_list_plugins (discover names) / AC_load_plugins (discover + register) and ac_list_plugins / ac_load_plugins. The entry-point source is injectable, so discovery is unit-testable without installing a real plugin. This is the declarative, namespaced complement to the existing runtime path loader.