Overview
PluginManifest is the structured metadata every plugin must declare. The runtime composes it into the Tier-1 prompt block, feeds it to the meta-tools, and validates it at boot.
Type
Fields
title
title
- Type:
string - Required: yes
[Climate Data] Fetch emissions…) and appears in qiforge inspect. Distinct from name — name is kebab-case unique identifier, title is prose.summary
summary
- Type:
string - Required: yes
always plugins as - {name}: {summary}. Keep it short — every Tier-1 plugin costs ~80 tokens on every turn.Validation:- Hard: must be non-empty.
- Soft warn: > 120 chars.
whenToUse
whenToUse
- Type:
string[] - Required: when
visibility !== 'silent'
- Hard: at least 1 entry when
visibility !== 'silent'. - Soft warn: > 8 entries, or any entry > 100 chars.
whenNotToUse
whenNotToUse
- Type:
string[] - Required: no
examples
examples
- Type:
ManifestExample[] - Required: no
- Hard: every
example.toolmust reference a tool actually registered by this plugin.
tags
tags
category
category
- Type:
'data' | 'communication' | 'automation' | 'memory' | 'integration' | 'ui' | 'auth' | 'observability' | 'core' - Required: no
list_capabilities output.visibility
visibility
- Type:
'always' | 'on-demand' | 'silent' - Required: no
- Default:
'on-demand'
always— tools bound at boot; listed in Tier-1 prompt.on-demand— tools NOT bound; manifest discoverable vialist_capabilities; agent callsload_capabilityto make tools available.silent— invisible to agent; runs as middleware-only.
stability
stability
- Type:
'stable' | 'beta' | 'experimental' - Required: no
experimental plugins get a warning footnote in list_capabilities output.ManifestExample
thought is optional but useful — agents pick up the reasoning pattern alongside the example.
Validation behaviour
At boot the runtime callsvalidateManifest(manifest, pluginName) from @ixo/oracle-runtime/manifest. The result:
Cross-checking examples against tools
Everyexample.tool is checked against the plugin’s registered tool names. If a manifest references tool: 'foo' but the plugin doesn’t register a tool named foo, boot fails: