tai-plugin.yml schema (PluginSpec).
Every installable TAI plugin ships a tai-plugin.yml — at its repo root and
as package-data inside the built wheel. The file names the listing
(namespace/name), the pip distribution that backs it, the tai42-contract
compatibility range, declared capabilities, and the item-level provides
index: one entry per tool/agent/extension/… the package registers, because
items are what users search for while the plugin is what gets installed.
The models here are the one schema shared by the marketplace registry’s
validator, the skeleton’s installer, and each plugin repo’s own spec test.
The YAML I/O helpers live above the contract (tai42_kit.plugins) — the
contract itself has no YAML dependency.
KIND_MANIFEST_BINDINGS is the single source for how each provided item
kind wires into a Manifest: which manifest
field an installer patches and with what shape (a config row, a module-list
entry, a single-module slot, a package-name entry, or no manifest field at
all for the env-selected config kind).
Version strings are validated as PEP 440 (an anchored regex of the spec’s
canonical pattern) and contract as a PEP 440 specifier set — shape-level
parseability only; evaluating whether a version satisfies a range is the
consumer’s concern.
display_name and icon are the optional marketplace display metadata: a
human UI title (the UI titleizes name when absent) and either a packaged
image path relative to the package root or an https URL (the UI falls back
to a generated monogram when absent).
KIND_MANIFEST_BINDINGS
tai42_contract.plugins.KIND_MANIFEST_BINDINGS
ManifestBinding
tai42_contract.plugins.ManifestBinding
Manifest.
field names the manifest field an installer patches for an item of
this kind; mode is the patch shape:
config_row— append a config row (tools/agents) whosemoduleis the item’s module.module_list— append the item’s module to a plain module list.scalar_module— set a single-module slot; the slot holds ONE module, so a second plugin claiming an occupied slot is a conflict the caller must reject loudly.package_list— append the plugin’s DISTRIBUTION name (not the item’s module) to a package list (studio_plugins).env_selected— no manifest field: the kind is selected through the environment (aconfigprovider is named byTAI_CONFIG_MODEand imported by the config seam), sofieldisNone.
PluginItem
tai42_contract.plugins.PluginItem
provides index.
module is the import path whose import side-effect registers the item
(or, for env-selected kinds, the module the selecting seam imports); the
installer patches it into the manifest per KIND_MANIFEST_BINDINGS.
Attributes
PluginItemKind
tai42_contract.plugins.PluginItemKind
KIND_MANIFEST_BINDINGS maps
every member onto its manifest wiring; an unknown kind in a spec is a
loud validation reject, never a skipped row.
Attributes
PluginPermissions
tai42_contract.plugins.PluginPermissions
False); an
unknown key is rejected loudly rather than silently ignored.
Attributes
PluginSpec
tai42_contract.plugins.PluginSpec
tai-plugin.yml.
Frozen and extra="forbid": a typo’d key fails validation loudly. The
listing reference is namespace/name (ref); package is the
normalized pip distribution the listing points at; version must equal
the built wheel’s version (each plugin repo’s spec test and the registry’s
ingest validation both pin that); contract is the tai42-contract
compatibility range as a PEP 440 specifier set. display_name and
icon are optional marketplace display metadata.
Attributes
Members
ref
tai42_contract.plugins.PluginSpec.ref
namespace/name.
