feat(FN-3182): scope plugin installs globally with project enablement
- Store plugin installation metadata in central DB while preserving per-project enable/disable state - Update plugin CLI and dashboard Plugin Manager copy/behavior to distinguish global install from project enablement - Expand plugin store and loader test coverage, including legacy migration and scoped install assertions - Update runtime plugin e2e tests to use isolated central DB directories and document the new semantics - Add a changeset for @runfusion/fusion describing the plugin scope behavior change Fusion-Task-Id: FN-3182
This commit is contained in:
@@ -301,8 +301,11 @@ Hybrid evaluator pipeline (FN-3389/FN-3391):
|
||||
|
||||
### Plugin System
|
||||
|
||||
- `PluginStore` (`plugin-store.ts`) stores plugin installation state and settings (`plugins` table)
|
||||
- `PluginLoader` (`plugin-loader.ts`) loads/unloads plugin modules and emits lifecycle events
|
||||
- `PluginStore` (`plugin-store.ts`) is a facade over two persistence scopes:
|
||||
- **Global install metadata** in central DB table `plugin_installs` (`~/.fusion/fusion-central.db`) including manifest/path/settings/schema/dependencies
|
||||
- **Per-project runtime state** in central DB table `project_plugin_states` keyed by normalized project path (`enabled`, `state`, `error`)
|
||||
- Legacy project-local `plugins` rows in `.fusion/fusion.db` are migrated lazily on plugin-store init/read; migration is idempotent and keeps newest `updatedAt` install metadata as global canonical data while preserving per-project enablement rows
|
||||
- `PluginLoader` (`plugin-loader.ts`) loads/unloads plugin modules using the effective per-project plugin state
|
||||
- Plugin contributions now include both embedded `uiSlots` and top-level `dashboardViews`
|
||||
- Discovery endpoints:
|
||||
- `GET /api/plugins/ui-slots`
|
||||
|
||||
@@ -828,6 +828,11 @@ fn plugin create <name>
|
||||
|
||||
Subcommands: `list|ls`, `install`, `rescan`, `uninstall`, `enable`, `disable`, `create`.
|
||||
|
||||
Scope semantics:
|
||||
- `fn plugin install` / `fn plugin uninstall` are **global** operations
|
||||
- `fn plugin enable` / `fn plugin disable` are **project-scoped** operations (`--project` selects the project context)
|
||||
- `fn plugin list` shows globally installed plugins plus enabled/disabled state for the current project context
|
||||
|
||||
`fn plugin install --ai-scan` enables AI security scanning on plugin load. `fn plugin rescan <id>` runs a fresh scan/reload cycle and prints plugin name, verdict, summary, and finding count. It exits non-zero for `blocked`, `error`, or `unavailable` verdicts.
|
||||
|
||||
---
|
||||
|
||||
@@ -80,6 +80,18 @@ Central health tracking keeps mutable project metrics, including:
|
||||
|
||||
A singleton central record enforces system-wide limits so one project cannot monopolize all execution slots.
|
||||
|
||||
## Plugin Scope in Multi-Project Mode
|
||||
|
||||
Plugin persistence is split across global and project scopes:
|
||||
|
||||
- Global installation metadata is shared across projects in `~/.fusion/fusion-central.db` (`plugin_installs`)
|
||||
- Per-project activation/runtime state is tracked separately per normalized project path (`project_plugin_states`)
|
||||
|
||||
Operationally:
|
||||
- `install` / `uninstall` are global actions
|
||||
- `enable` / `disable` and runtime state/error are project-scoped
|
||||
- A single global plugin install can be enabled in one project and disabled in another
|
||||
|
||||
## Isolation Modes
|
||||
|
||||
Projects can run with:
|
||||
|
||||
@@ -573,6 +573,8 @@ The fallback ensures tasks continue executing even if the configured runtime plu
|
||||
|
||||
To use plugin-provided runtimes like Paperclip, Hermes, or OpenClaw:
|
||||
|
||||
> Scope model: plugin installation + plugin settings are global (shared across projects), while plugin enabled/disabled state and runtime status are project-scoped.
|
||||
|
||||
1. Install one or more runtime plugins:
|
||||
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user