-
Notifications
You must be signed in to change notification settings - Fork 0
Roadmap
This page tracks committed directions, future themes, and completed work. It is not an issue index. When a roadmap item becomes concrete, a GitHub issue is opened with a fresh number; until then, entries here are descriptive only.
No committed releases at this time. Candidates under evaluation:
-
P1.2 Service-Registry RFC - cross-plugin service consumption beyond
depends_on. Originally surfaced in the Bibliogon v0.8.0 brief. -
P3.1 Hot-Reload unification - converge
reload_plugin(name)andrediscover()paths into a single coherent reload story. - P3.2 Plugin metrics - first-class metrics surface for plugin activation latency, hook-call counts, error rates.
See docs/design/v0.8.0-improvements-triage-2026-05-20.md for the triage status of these and other items from the v0.8.0 brief. No timelines are committed; promotion to a release happens when a concrete RFC lands and a maintainer commits to delivery.
Themes worth pursuing if downstream demand surfaces. None of these have an assigned issue or release.
Plugin depends_on currently uses plain names (depends_on = ["export"]). A natural extension is version-constrained dependencies (depends_on = [("export", ">=1.0.0")]) with proper semver-with-label comparison. Would touch the dependency-resolution module, depends_on schema, and api_version compatibility logic.
When plugin C depends on plugin B which depends on A, C should be able to query A's extensions. The topological sort already handles load order; an explicit accessor like plugin.get_dependency("export") or scoped pm.get_extensions(point, depended_by=plugin) would expose the relationship at runtime.
Standardized metadata on @hookimpl (priority, description, version) for marketplaces, settings UIs, and conflict resolution. Pluggy does not natively support custom attributes; would need a wrapper decorator and a metadata registry on PluginManager.
Static analysis of plugin code before activation (AST scan for dangerous imports like os.system, subprocess, eval). Essential for a plugin marketplace where untrusted plugins are installed. Configurable allow/deny lists; integration into the discovery pipeline.
activate() / deactivate() as async def for hosts that want native asyncio integration. Currently sync. Adds complexity to the lifecycle state machine and hookspec interactions; reconsider when an application requires it. Noted as Not Planned below until a concrete need surfaces.
The v0.6.0 milestone in the wiki Roadmap originally tracked semver-with-labels dependencies and transitive extension access. Superseded. v0.6.0 instead shipped as the plugin lifecycle release (PluginError / PluginState / DiscoveryResult / DiscoveryDiff primitives, rediscover(), refresh_config(), version gating, on_config_changed). The semver and transitive-extension topics remain deferred with no committed timeline; they appear above in "Future direction" as themes for potential future work.
| Version | Feature |
|---|---|
| v0.10.0 | Consolidation release. API additions: PluginManager.merge_app_config(overlay, *, notify=True) recursive-merge entry point (closes the manager._app_config = ... private-attribute hack used by two independent consumers); refresh_config(notify=) kwarg; DiscoveryDiff.by_filter_reason() parity helper. Public-API re-exports: FilterReason, ErrorPhase, config_diff now in pluginforge.__all__ per the v0.6.0 promise. Decision: single-router DeprecationWarning stays through v0.10.0; earliest error transition v0.11.0. Stale-prose fix: pip install pluginforge[fastapi] scrubbed from README + examples. Housekeeping: twine in dev deps; release-workflow cd .. paragraph; docs/ARCHITECTURE.md v0.5.0 -> v0.10.0 audit (#13 closed). See docs/design/v0.10.0-consolidation.md. |
| v0.9.0 | Two legs. Lifecycle visibility (P1.1): PluginState.activated_at / last_config_change / source fields; PluginInspection frozen dataclass + PluginManager.inspect_plugin(name) aggregator; three event hooks (on_plugin_activated, on_plugin_deactivated, on_config_refreshed) with deregistration-closure pattern. Hard-filter transition (deferred from v0.8.0): FilterReason.missing_target_application; _check_identity returns hard error for the host-has-app_id + plugin-missing-target row; v0.7.0 deprecation warning retired. Permissive semantics preserved for hosts without app_id. See docs/design/v0.9.0-lifecycle-visibility.md. |
| v0.8.0 | Stability and tooling: idempotent mount_plugin_routes (closes the v0.7.0 recursion cascade on long pytest sweeps), pluginforge.testing namespace (IsolatedPluginManager, MockPlugin), single-router DeprecationWarning on multi-router plugins, PEP 561 py.typed marker, consumer-integration guide, plugin-author guide (skeleton). See docs/design/v0.8.0-improvements-triage-2026-05-20.md. |
| v0.7.0 | Application identity gating: target_application on BasePlugin, app_id on PluginManager, FilterReason.wrong_application, ErrorPhase.identity_check, v0.7.0 deprecation warning path |
| v0.6.1 | Packaging hygiene: PEP 621 [project] table migration, removed broken [fastapi] / [alembic] extras, Development Status bumped to Beta |
| v0.6.0 | Plugin lifecycle: PluginError / PluginState / DiscoveryResult / DiscoveryDiff primitives, rediscover(), refresh_config() + on_config_changed, api_version + min_app_version version gating with severity, pluginforge.utils.config_diff
|
| v0.5.0 | Plugin introspection (get_plugin_hooks, get_all_hook_names), graceful degradation (call_hook_safe), robust deactivate, lifecycle documentation refresh |
| v0.4.0 | Hot-reload (reload_plugin), extension points (get_extensions), path-traversal prevention, plugin introspection foundation |
| v0.3.0 | Config schema validation, plugin health checks, register_plugin (single instance), get_load_errors, pre_activate callback, api_version check, reload_config, configurable route prefix, get_frontend_manifest, list_available_plugins
|
| v0.2.0 | pluggy ^1.5.0 minimum, restore app_config on instance, document BasePlugin + pluggy integration |
| v0.1.0 | Initial release: BasePlugin, PluginManager, YAML config, entry-point discovery, dependency resolution, lifecycle, FastAPI routes (optional), Alembic migrations (optional), i18n |
| Topic | Reason |
|---|---|
Async lifecycle (async def activate) |
No current need; adds complexity to lifecycle state machine and hookspec interactions. Reconsider when an application requires it. Cross-listed in "Future direction" if demand surfaces. |