Skip to content

Commit 19fb672

Browse files
authored
Merge pull request #10 from astrapi69/docs/v0.8.0-post-release-updates
docs: v0.8.0 post-release surface updates
2 parents 8fa1347 + b0a2f37 commit 19fb672

2 files changed

Lines changed: 16 additions & 1 deletion

File tree

‎README.md‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,10 @@ pm.mount_routes(app) # Routes under /api/ (configurable prefix)
102102
- **Version Gating** - Enforce `api_version` and `min_app_version` with configurable severity
103103
- **Application Identity Gating** - Declare `target_application` on plugins and `app_id` on the host; mismatched plugins refuse to activate. Permissive: enforcement only fires when the host has declared `app_id`
104104
- **FastAPI Integration** - Mount plugin routes with configurable prefix
105+
- **Idempotent Route Mounting (v0.8.0)** - `mount_routes` is safe to re-call; no route-table accumulation across `TestClient` lifespans (closes the v0.7.0 recursion-cascade reported by downstream consumers)
106+
- **Test Helpers (v0.8.0)** - `pluginforge.testing.IsolatedPluginManager` and `MockPlugin` for consumer-app test wiring
107+
- **Single-Router Convention (v0.8.0)** - one router per `get_routes()` is recommended; multi-router plugins emit a `DeprecationWarning`
108+
- **Type Annotations (PEP 561)** - `py.typed` marker shipped; `mypy` / `pyright` consume PluginForge's full type information
105109
- **Alembic Support** - Collect migration directories from plugins
106110
- **i18n** - Multi-language strings from YAML with fallback
107111
- **Security** - Plugin name validation and path traversal prevention
@@ -145,8 +149,10 @@ pm.get_text("common.save", "de") # "Speichern"
145149

146150
## Documentation
147151

148-
The full documentation is available in the [Wiki](https://github.com/astrapi69/pluginforge/wiki):
152+
The full documentation is available in the [Wiki](https://github.com/astrapi69/pluginforge/wiki) and the in-repo guides:
149153

154+
- [Consumer Integration Guide](docs/guides/consumer-integration.md) - wire PluginForge into your FastAPI app from scratch (covers lifespan, mounting, hot reload, testing)
155+
- [Plugin Author Guide](docs/guides/plugin-author.md) - write a PluginForge plugin (BasePlugin contract, identity gating, single-router convention, lifecycle hooks)
150156
- [Getting Started](https://github.com/astrapi69/pluginforge/wiki/Getting-Started)
151157
- [BasePlugin](https://github.com/astrapi69/pluginforge/wiki/BasePlugin)
152158
- [PluginManager](https://github.com/astrapi69/pluginforge/wiki/PluginManager)

‎docs/design/v0.7.0-application-identity.md‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@
66
**Reviewers:** PluginForge maintainers, downstream consumer agents (Bibliogon, AdaptivLearner, third-party)
77
**Tracking issue:** [#1](https://github.com/astrapi69/pluginforge/issues/1)
88

9+
> **Post-release note (2026-05-20):** The "v0.8.0 enforcement" behavior
10+
> described below as future-tense (Decision 4 Migration, the Behavior
11+
> Matrix v0.8.0 column, Q2/Q4 resolutions, etc.) did NOT ship in v0.8.0.
12+
> v0.8.0 shipped with the v0.7.0 warning behavior preserved; the
13+
> hard-filter transition is deferred to v0.9.0. See the Roadmap and
14+
> CHANGELOG for the actual v0.8.0 contents. This document is left
15+
> unrevised as a record of what was planned at the time the v0.7.0
16+
> implementation shipped.
17+
918
## Context
1019

1120
PluginForge today has no concept of which application a plugin targets. The de facto isolation mechanism (entry-point group separation via `plugins.entry_point_group` in `app.yaml`) is a publishing convention, not an enforced invariant. A plugin can register under multiple groups, a plugin's own code cannot assert which application it targets, and a user pip-installing a plugin from a wrong source has no protection.

0 commit comments

Comments
 (0)