Plugin architecture
A VibeX plugin is an installable, toggleable, configurable product unit. One package is one user-visible capability: stable identity, one-line summary, content tree, root config, and lifecycle. App, Agent, Host, and Runtime are integration targets inside the package. Settings → Plugins shows name, summary, publisher, version, and the enable switch.
Changes to platform source, Tauri commands, or Application Core belong under Platform architecture. When the public SDK lacks a Host capability, add a generic capability and SDK export first, then consume it from the plugin. Core may know contribution kinds and Host slots. Special cases keyed by plugin ID or file format are debt.
Platform disciplines
Official plugins and third-party plugins use the same public SDK, contribution points, and toolchain. The Host does not branch on plugin ID and does not keep private host.call APIs, private slots, or private lifecycles for official packages. CI runs pnpm run plugin:no-privilege: official packages import only the public SDK; Host code carries no official-plugin-ID branches.
A plugin targets Host contribution points only. dependencies.kind accepts runtime. CLI validate and Host inspect reject kind: plugin. To reuse another plugin, copy its source and republish under a new Publisher + Plugin ID. The derived package installs, stores data, and updates independently. When several plugins occupy the same contribution point, the Host aggregates what can be aggregated and asks the user to choose when a single selection is required.
A new contribution point enters the stable surface together with its first official consumer and four acceptance items: CLI validate, Host inspect, real UI/Agent consumption, and author docs. Authors build against the stable kinds listed in these docs.
Trust model
Install or enable means Full Trust. Worker, App, declared Runtimes, filesystem, process, and network use the same local rights as the Host. Separate processes and App frames handle hot reload, crash isolation, and dispose.
v4 public manifests default the execution class to full-trust. The product UI omits per-capability grant dialogs. Integrity depends on a deterministic digest, candidate rollback, revision-conflict handling, and resource cleanup. The permissions array remains as compatibility metadata for older v4 packages. New packages omit it. packageClass=isolated does not change the execution model: the Host still spawns the Worker under Full Trust.
Install and update show this confirmation:
After install this plugin runs with your local user rights. It is not a sandbox.
Cancel leaves the catalog unchanged.
Identity and compatibility
Product identity is Publisher plus Plugin ID. Display name, folder name, and similar contents remain presentation. Packages with the same ID and different publishers keep separate grants and data. engines.vibex and engines.pluginSdk declare the compatible range. Current matrix: Host 0.1.3, protocol 1.1, SDK 1.0.0.
Install identity is the tuple owner / plugin-name / tag / version. Marketplace owner is the marketplace account. GitHub owner is the repository owner. One Host keeps one membership per product identity.
Sources and lock
Settings → Plugins has two catalog tabs: Installed and Marketplace. The detail page still has only Content and Config.
Official product plugins install from the marketplace official category, start disabled, and can be uninstalled: Office, Session Enhance, Multi-agent, Workflow Creator, Plugin Development, and Remote SSH. Official reference plugins (Host chrome sample, structure-surface sample, environment-variable provider import) demonstrate public contribution points on the same install path. The Host family still ships official MCP binaries (vibex-mcp, vibex-workflow-mcp). Bytes on disk are not an installed plugin, and not an injected session.
Each product identity hangs on exactly one source:
| Source | How it lands | Updates |
|---|---|---|
| Marketplace snapshot | Marketplace tab or plugin add --web to the listing URL |
Catalog versions; Installed can show Update available |
| GitHub snapshot | plugin add --web to a repo, #tag, or Release |
That repo's tags; Installed can show Update available |
| Local archive | Drop a .vxp or plugin add --profile |
No remote update channel |
| Linked development | plugin add --dev |
Follows source digest; no Update available |
A #tag / #commit, a marketplace install, or a Release whose digest verified records origin and locks it. plugin update follows the origin lock. Linked development edits the source directory; the Host publishes a candidate generation when the digest changes and never deletes that directory.
Uploaded marketplace packages may show or hide the package tree. GitHub listings show it by default. The Host honors showTree when it fetches the listing.
Agent-native plugins (Codex, Claude Code) stay under Settings → Agent → that Agent. They do not enter this product catalog.
npx vibex plugin list and the Installed tab are the same catalog. remove uninstalls an installed package and keeps user config by default; --delete-data drops the Host-managed snapshot and config. Host-owned Runtimes with no remaining plugin references are reclaimed on uninstall or by gc-runtimes.
Install commands, dropping a .vxp, and linked development: Install a Plugin from the marketplace and Development workflow.
Dual activation
Enable is the durable intent to publish ready contributions. Timing differs by class:
| Class | When it applies |
|---|---|
| Agent-side (Skill, managed MCP, Hook) | Conversations created or rebound after enable receive the tool list |
| UI and Provider (commands, toolbar, status, panels, tabs, kanban views, file openers, import sources, remote provisioners) | Appear on enable, vanish atomically on disable |
The catalog subtitle “Extend the platform with plugins. They apply after a new session.” describes the Agent-side boundary. Conversations already open keep the tool list from creation.
UI contract
/plugins keeps the settings sidebar. Installed lists catalog members in one column. Marketplace pins the official category, then up to 50 community rows; search covers every published listing. Click through to /plugins/:pluginId. Content shows the README and Host-validated contents/; a package tree appears when the author allows it. Config renders config.schema and writes root config.json atomically. Generation, Runtime locks, and handler lists belong in doctor and the detail-page health section.
Plugin UI chooses a rendering track by interaction density: Host-rendered descriptors (status items, commands, light blocks); Module Federation panels (app.tab / app.panel / app.kanban.view / app.settings.page); iframe App surfaces (document-style UI and artifact.editor).
Completion
- A user can install from the marketplace or a local archive, enable the package, and finish the operations the package promises on Content or Config.
- Manifest, SDK, CLI validation, Host parsing, and UI consumption agree on every integration.
- After a linked install, the user path works on a real Host. The harness covers in-process contracts; file tabs, preview processes, Runtimes, structure surfaces, and remote observation are accepted on a running Host.
- The README states requirements, offline and network behavior, troubleshooting, third-party licenses, and what happens to config after uninstall.

