# description
Two shapes in one file: (1) the per-plugin manifest that authors ship as `plugin.json` (see `$defs/PluginManifest`); (2) the aggregate registry the implementation produces on disk (e.g. `~/.skill-map/plugins.json`), which lists all discovered plugins with their compat status. Both shapes are normative. camelCase keys throughout.

# $defs.PluginManifest.properties.id.description
Kebab-case, globally unique plugin identifier.

# $defs.PluginManifest.properties.specCompat.description
Semver range this plugin is compatible with (e.g. `^1.0.0`, `>=0.3.0 <0.4.0`). Checked via `semver.satisfies(specVersion, this)` at load time.

# $defs.PluginManifest.properties.extensions.description
Relative paths to extension files, resolved from the plugin directory.

# $defs.PluginManifest.properties.storage.description
Persistence mode for this plugin. Absent = plugin does not persist state.

# $defs.PluginManifest.properties.storage.oneOf[].properties.mode.description
Shared `state_plugin_kv` table, scoped by plugin id.

# $defs.PluginManifest.properties.storage.oneOf[].properties.migrations.description
Relative paths to `.sql` migration files.

# $defs.DiscoveredPlugin.properties.status.description
Resolved state after discovery. `disabled` = user-disabled via config; others = automatic.

# $defs.DiscoveredPlugin.properties.statusReason.description
Human-readable detail when status is anything other than `enabled`.