Manifest reference
Every module declares a module-manifest.json at its root. The platform validates it with the Zod schema in @tv/extension-sdk/manifest and the JSON Schema at manifest.schema.json.
Validate
bash
npx tv-sdk validate module-manifest.json
# exit 0 valid, 1 invalid, 2 usage errorTop-level fields
| Field | Required | Description |
|---|---|---|
$schema | recommended | URL to the versioned JSON Schema for editor validation |
id | yes | @vendor/module-name — globally unique |
name | yes | Human-readable display name |
version | yes | Semver of your module |
minCoreVersion | yes | Minimum platform version, e.g. >=2.0.0 |
sdkVersion | recommended | SDK range you built against, e.g. ^1.0.0 |
category | yes | core / operations / engagement / infrastructure |
buildingTypes | yes | ["all"] or specific types like ["mall","office"] |
permissions | yes | What platform resources you read/write |
events | yes | publishes + subscribes arrays |
ui | when you have UI | routes + navigation entries |
Permissions
json
"permissions": [
{ "subject": "building.spaces", "actions": ["read"] },
{ "subject": "building.elements", "actions": ["read", "write"] }
]Subjects + actions come from the platform's permission catalog. Validate yours against it:
bash
npx tv-sdk snapshot-permissions # see the live catalogUI
json
"ui": {
"routes": [{ "path": "/cafm" }],
"navigation": [
{ "label": "CAFM", "path": "/cafm", "section": "operations" }
]
}routes are where your federated Shell mounts. navigation is what appears in the Building OS sidebar.
Full example
See the reference module for a complete, validated manifest with mcpTools, heartbeat, and HMAC-signed federation.
Stability of the schema
The manifest schema follows the SDK's semver. Breaking changes (new required fields, removed fields) bump the SDK major. Additive fields bump the minor. See the stability policy.