Skip to content

Roadmap

Asterios Raptis edited this page May 21, 2026 · 5 revisions

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.

Committed direction

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) and rediscover() 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.

Future direction (no scheduling)

Themes worth pursuing if downstream demand surfaces. None of these have an assigned issue or release.

Semantic-versioning dependencies

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.

Transitive extension access

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.

Extension-implementation metadata

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.

Plugin source/safety analysis

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.

Async lifecycle

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.

Deferred / superseded

v0.6.0 - Semantic-versioning plan

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.

Completed

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

Not planned

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.

Clone this wiki locally