# PluginManifest

> _Since v1.1.0_

Static metadata about a plugin's capabilities and requirements.
Declared as a static property on plugin classes.

#### Example

```typescript
export class MyPlugin extends BaseGridPlugin<MyConfig> {
  static override readonly manifest: PluginManifest<MyConfig> = {
    ownedProperties: [
      { property: 'myProp', level: 'column', description: 'the "myProp" column property' },
    ],
    configRules: [
      { id: 'my-plugin/invalid-combo', severity: 'warn', message: '...', check: (c) => c.a && c.b },
    ],
  };
  readonly name = 'myPlugin';
}
```

## Properties

| Property | Type | Description |
| -------- | ---- | ----------- |
| `ownedProperties?` | <code>PluginPropertyDefinition[]</code> | Properties this plugin owns - validated by validate-config.ts. If a user uses one of these properties without loading the plugin, an error is thrown. |
| `hookPriority?` | <code>Partial&lt;Record&lt;HookName, number&gt;&gt;</code> | Hook execution priority (higher = later, default 0). Use negative values to run earlier, positive to run later. |
| `configRules?` | <code>PluginConfigRule&lt;TConfig&gt;[]</code> | Configuration validation rules - checked during grid initialization. Rules with severity 'error' throw, 'warn' logs to console. |
| `incompatibleWith?` | <code>PluginIncompatibility[]</code> | Plugins that are incompatible with this plugin. When both plugins are loaded together, a warning is shown. |
| `queries?` | <code><a href="/grid/api/plugin-development/interfaces/querydefinition/">QueryDefinition</a>[]</code> | Queries this plugin can handle. Declares what query types this plugin responds to via `handleQuery()`. This replaces the centralized PLUGIN_QUERIES approach with manifest-declared queries. |
| `events?` | <code><a href="/grid/api/plugin-development/interfaces/eventdefinition/">EventDefinition</a>[]</code> | Events this plugin can emit. Declares what event types other plugins can subscribe to via `on()`. |
| `modifiesRowStructure?` | <code>boolean</code> | Whether this plugin's `processRows` hook injects or removes rows (group headers, tree nodes, pivot aggregates, placeholders, etc.). |

### Property Details

#### incompatibleWith

```typescript
incompatibleWith: [
  { name: 'tree', reason: 'Both transform the entire row model in different ways' },
],
```

---

#### queries

```typescript
queries: [
  { type: 'canMoveColumn', description: 'Check if a column can be moved' },
],
```

---

#### events

```typescript
events: [
  { type: 'filter-change', description: 'Emitted when filter criteria change' },
],
```

---
