# @mwillbanks/tuil-plugin

Source: /tuil/docs/reference/packages/plugin
Locale: en

Dependency-aware plugin registration, resolution, activation, and teardown for tuil.



## Overview [#overview]

Dependency-aware plugin registration, resolution, activation, and teardown for tuil.

`@mwillbanks/tuil-plugin` is independently installable and also participates in the
umbrella `@mwillbanks/tuil` runtime where applicable.

## Installation [#installation]

<CodeBlockTabs defaultValue="npm">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash
    npm install @mwillbanks/tuil-plugin
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash
    pnpm add @mwillbanks/tuil-plugin
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash
    yarn add @mwillbanks/tuil-plugin
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash
    bun add @mwillbanks/tuil-plugin
    ```
  </CodeBlockTab>
</CodeBlockTabs>

## How it operates [#how-it-operates]

Plugins declare capabilities and dependencies, register services, commands, events, and typed extension points, then activate in dependency order with deterministic reverse teardown.

<Mermaid
  chart="flowchart LR
  S0[&#x22;resolve graph&#x22;]
  S1[&#x22;register&#x22;]
  S2[&#x22;initialize&#x22;]
  S3[&#x22;activate&#x22;]
  S4[&#x22;deactivate&#x22;]
  S5[&#x22;dispose&#x22;]
  S0 --> S1
  S1 --> S2
  S2 --> S3
  S3 --> S4
  S4 --> S5"
/>

## API [#api]

| API                                                                                      | Signature                          | Description                              |
| ---------------------------------------------------------------------------------------- | ---------------------------------- | ---------------------------------------- |
| [`DefaultExtensionPoints`](/tuil/docs/reference/packages/plugin/api/default-extension-points) | `interface DefaultExtensionPoints` | Public interface DefaultExtensionPoints. |
| [`ExtensionPointMap`](/tuil/docs/reference/packages/plugin/api/extension-point-map)           | `type ExtensionPointMap`           | Public type ExtensionPointMap.           |
| [`ExtensionRegistry`](/tuil/docs/reference/packages/plugin/api/extension-registry)            | `interface ExtensionRegistry`      | Public interface ExtensionRegistry.      |
| [`Plugin`](/tuil/docs/reference/packages/plugin/api/plugin)                                   | `interface Plugin`                 | Public interface Plugin.                 |
| [`PluginCapability`](/tuil/docs/reference/packages/plugin/api/plugin-capability)              | `type PluginCapability`            | Public type PluginCapability.            |
| [`PluginContext`](/tuil/docs/reference/packages/plugin/api/plugin-context)                    | `interface PluginContext`          | Public interface PluginContext.          |
| [`PluginRegistryEntry`](/tuil/docs/reference/packages/plugin/api/plugin-registry-entry)       | `interface PluginRegistryEntry`    | Public interface PluginRegistryEntry.    |
| [`PluginRegistryQuery`](/tuil/docs/reference/packages/plugin/api/plugin-registry-query)       | `interface PluginRegistryQuery`    | Public interface PluginRegistryQuery.    |

## Events and lifecycle [#events-and-lifecycle]

Plugins may declare or subscribe to the host application event map. Plugin health is exposed as an observable runtime surface.

All subscriptions and registrations return a disposer or belong to an owning
runtime that disposes them in reverse order.

## Example [#example]

```tsx
const plugin = createPlugin({ id: "analytics", activate(context) { return context.events.observe(track); } });
```

## Related [#related]

* [Package architecture](/tuil/docs/concepts/packages)
* [Events](/tuil/docs/concepts/events)
* [Testing](/tuil/docs/guides/testing)
