Plugin System
# Plugin System
Plugins are first-class runtime modules in qti-clockwork-app.
Plugin Contract
const plugin = {
id: 'example',
version: '1.0.0',
depends: [],
init(app) {},
shutdown(app) {},
reload() {}
}
Clockwork JVM example:
import com.quietterminal.clockwork.ClockworkApp;
import com.quietterminal.clockwork.ClockworkPlugin;
import com.quietterminal.clockwork.WorldApi;
ClockworkPlugin plugin = new ClockworkPlugin() {
@Override public String name() { return "example"; }
@Override public String[] depends() { return new String[0]; }
@Override public void register(ClockworkApp app, WorldApi world) {}
@Override public void init(ClockworkApp app, WorldApi world) {}
@Override public void shutdown(ClockworkApp app, WorldApi world) {}
};
ClockworkApp app = new ClockworkApp().use(plugin).build();
app.shutdown();
Dependency Resolution
PluginManager topologically sorts plugins by depends.
Failure cases:
- missing dependency
- circular dependency
- duplicate plugin id
Ownership Isolation
Registries track active plugin ownership during init.
Owned keys cannot be modified by other plugins:
- component registry keys
- system ids
- resource keys
- asset loader keys
This prevents cross-plugin mutation bugs.
Reload Behavior
plugins.reload(pluginId) is isolated:
- if plugin has
reload, it executes - reload exceptions are logged
- runtime remains alive
Shutdown Behavior
shutdownAll(app) runs plugins in reverse init order.
Catalog Pattern
PluginCatalog provides name-to-factory registration.
createDefaultPluginCatalog() includes placeholders:
- physics
- ui
- particle
- tilemap
- networking