Package specification
v4 package paths are relative to the package root and use /. Host and CLI reject absolute paths, .., symlinks, hard links, case collisions, duplicate normalized paths, and over-limit content.
my-plugin/
├─ .vibex-plugin/
│ ├─ plugin.json
│ ├─ content.index.json
│ ├─ package.lock.json
│ ├─ signature.json
│ └─ sbom.spdx.json
├─ README.md
├─ config.json
├─ contents/
│ ├─ skills/
│ ├─ mcps/
│ ├─ hooks/
│ ├─ workflows/
│ └─ resources/
├─ depends/
│ ├─ runtimes/
│ └─ packages/
├─ runtime/
└─ dist/runtime/ holds author source. The release pack contains README, the initial config.json, contents/, depends/, dist/, and .vibex-plugin metadata. signature.json and SBOM are optional.
README
Root README.md frontmatter must contain a standalone summary: one sentence, non-empty, at most 200 Unicode characters, plain text. The catalog and detail title region show summary. The body is the README with frontmatter removed. Host and CLI read the summary field.
---
summary: Preview, create, and transform Word, Excel, and PowerPoint documents.
---
# VibeX OfficeConfiguration
Root config.json is the only Config-tab fact. The Host validates against config.schema in plugin.json, then writes via a sibling temp file, fsync, and atomic replace. The file is omitted from the executable digest, signature, and activation generation. Package updates keep the user's existing values by default and run a compatibility check against the new schema. The README states config retention after uninstall.
Persist settings in root config.json. Worker storage.settings.get and storage.settings.put echo the current input.
Content index
.vibex-plugin/content.index.json is initialized by the CLI, maintained by the author, strictly checked at build, and checked again by the Host. The UI reads the Host-returned index. kind drives icons and rendering. The Content tab defaults to README, then lists contents/ items. Each items[].path must resolve to a real file under contents/.
{
"schemaVersion": 1,
"items": [
{
"path": "contents/skills/office-docx/SKILL.md",
"kind": "skill",
"title": "Word documents"
}
]
}plugin.json
manifestVersion is 4. apiVersion is "1.0". readme is fixed as README.md. content.root is fixed as contents. entrypoints.worker.runtime is node, python, or native. Worker protocol 1.1. App protocol 1.0. Omit the retired format=javascript-esm field.
{
"$schema": "https://schemas.vibex.dev/plugin/v4/plugin.schema.json",
"manifestVersion": 4,
"apiVersion": "1.0",
"id": "notes",
"publisher": "you",
"version": "0.1.0",
"name": "Notes",
"readme": "README.md",
"engines": { "vibex": ">=0.1.3 <1.0.0", "pluginSdk": "^1.0.0" },
"content": {
"root": "contents",
"index": ".vibex-plugin/content.index.json"
},
"config": { "schema": { "type": "object", "properties": {}, "additionalProperties": false } },
"entrypoints": {
"worker": { "path": "dist/worker.mjs", "runtime": "node", "protocol": "1.1" },
"app": { "root": "dist/app", "document": "index.html", "protocol": "1.0" }
},
"integrations": [],
"interface": { "icon": "assets/icon.svg" }
}id matches ^[a-z0-9][a-z0-9._-]{1,62}$. publisher matches ^[a-z0-9][a-z0-9._-]{0,62}$. version is semver.
Dependencies
depends/ stores dependency descriptors. The dependencies array in plugin.json references them. Each item has:
| Field | Meaning |
|---|---|
kind |
runtime or plugin |
descriptor |
Package-relative path under depends/ |
optional |
When omitted, the dependency is required; true allows enable while the peer is not ready |
When kind is runtime, exact Runtime identity is id + version + target + digest. Versions may coexist. Download, integrity, probe, refcount, and reclaim are Host-managed.
When kind is plugin, enabling this package requires the peer to be installed, same publisher, enabled, and to have a live generation. The operator installs the peer.
Build and pack
vibex-plugin buildvalidates summary, schema, index, integrations, and dependencies. Whenruntime/main.mjsexists, it compiles todist/worker.mjs. Whenruntime/app.mjsandruntime/app.htmlexist, they compile todist/app/index.html. When an MCP resource declaresmanagedRuntime.source, that source compiles tomanagedRuntime.entrypoint.vibex-plugin packhashes the release file list, writes.vibex-plugin/package.lock.json, emits a deterministic.vxp, and printssha256:<digest>.install --linkalso computes and writes the lock from the current tree.- The release pack contains README, the initial config,
contents/,depends/,dist/, and.vibex-pluginmetadata. The source tree keepsruntime/,test/,package.json, lockfiles, source maps,.git,node_modules, and developer-link.
The Host starts a Node Worker with node --max-old-space-size=128 <entrypoints.worker.path>. A Python Worker is the Host-locked CPython plus that path. A native Worker path must be a compiled executable.

