From cd5ffcb676d276824f7c30c252f5f041befc17a5 Mon Sep 17 00:00:00 2001
From: Claude
Date: Fri, 22 May 2026 00:50:51 +0000
Subject: [PATCH 1/2] Refocus root README on monorepo overview
The root README duplicated the plugin-sdk package README. Replace it
with a short monorepo overview that links to the per-package README
for SDK installation and usage details.
https://claude.ai/code/session_01TYsJWz7wK2kDdLqd9GFJpM
---
README.md | 992 ++----------------------------------------------------
1 file changed, 27 insertions(+), 965 deletions(-)
diff --git a/README.md b/README.md
index efd2182..4ed61b9 100644
--- a/README.md
+++ b/README.md
@@ -7,982 +7,44 @@
-Sigma Computing Plugins provides an API for third-party applications add
-additional functionality into an existing Sigma workbook.
+# Sigma Computing Plugins
-Plugins are built using Sigma’s Plugin API. This API communicates data and
-interaction events between a Sigma workbook and the plugin. Plugins are hosted
-by their developer and rendered in an iframe in Sigma.
+This repository is the monorepo for Sigma Computing's Plugin platform. Sigma
+Plugins provide an API for third-party applications to add additional
+functionality into an existing Sigma workbook. Plugins are built using Sigma's
+Plugin API, which communicates data and interaction events between a Sigma
+workbook and the plugin. Plugins are hosted by their developer and rendered in
+an iframe in Sigma.
-#### Warning: Breaking Changes
+## Packages
-`@sigmacomputing/plugin` has moved to https://github.com/sigmacomputing/plugin and
-is now open source. Please read our
-[CHANGELOG.md](https://github.com/sigmacomputing/plugin/blob/main/CHANGELOG.md)
-to review any breaking changes that have been made.
+| Package | Description |
+| --- | --- |
+| [`@sigmacomputing/plugin`](./packages/plugin-sdk) | Client SDK for building Sigma plugins. Provides both a standard JavaScript API and a React Hooks API. |
-## Requirements
+For installation, usage, and API documentation, see the README of each package.
-To test your plugin in Sigma Plugin Dev Playground, you must:
-
-- Have an Admin, Creator or Explorer account type
-- Have Can Edit permission on the work
-- Be in the workbook’s Edit mode
-
-To test a development version of a registered plugin, you must:
-
-- Have either:
- - An Admin account type
- - A custom account type that supports plugin developer feature permissions
-
-- Have "can edit" permission on the workbook
-- Be in the workbook’s Edit mode
-
-Your plugin must be a Javascript-based project and run in the browser.
-
-## Getting Started
+## Contributing
-### Installation
+This repo is a [Yarn](https://yarnpkg.com/) workspaces monorepo orchestrated
+by [Turborepo](https://turbo.build/). See
+[CONTRIBUTING.md](./CONTRIBUTING.md) for setup instructions and development
+workflow.
-Provided you have already followed the steps to create a plugin and a plugin
-development environment, you can install `@sigmacomputing/plugin` using one of
-the following commands
+Common scripts available from the repo root:
```sh
-yarn add @sigmacomputing/plugin
-# or
-npm install @sigmacomputing/plugin
-```
-
-If you have yet to set up your development environment, follow one of the setup
-guides below
-
-### Create a Development Project
-
-At Sigma, we use React for all of our frontend development. This was taken into
-consideration when building Sigma’s Plugin feature.
-
-While you are not required to use React for your plugin, it must be written in
-Javascript and React is recommended. We support both a standard Javascript API
-and a React Hooks API.
-
-#### Create a Project with Vite
-
-1. Open your terminal and navigate to the directory you want to create your
- project in.
-2. Create your new project. We recommend using
- [`create-vite`](https://www.npmjs.com/package/create-vite).
-
- ```sh
- yarn create vite
- # or
- npm create vite@latest
- ```
-
-3. Then follow the prompts! You can also directly specify the project name and the template you want to use via additional command line options. For example, to scaffold a Vite + Vue project, run:
-
- ```sh
- yarn create vite my-vue-app --template vue
- ```
-
-4. Navigate to the project's main directory.
-
- ```sh
- cd
- ```
-
-5. Use your package manager to install Sigma’s plugin library. We recommend
- using `yarn`.
-
- ```sh
- yarn add @sigmacomputing/plugin
- ```
-
-6. Spin up your local development server.
-
- ```sh
- yarn && yarn dev
- ```
-
-7. Start developing:
- - Get started with Sigma’s Plugin APIs.
- - Test your plugin directly in a Sigma workbook using the Sigma Plugin Dev
- Playground.
- - By default, vite dev servers run on http://localhost:5173.
-
-NOTE: Facebook's [create-react-app](https://github.com/facebook/create-react-app) is deprecated. You should use [vite](https://github.com/vitejs/vite) to setup your project.
-
-## Testing your Plugin
-
-Plugin developers should have access to a special plugin called Sigma Plugin Dev
-Playground. This plugin is available from any workbook and points to
-http://localhost:3000, by default.
-
-If you cannot find this plugin, or would like a development playground with an
-alternative default host, please contact your Organization Admin with a request
-to Register a Plugin with its production URL set to your preferred development
-URL.
-
-### Using the Development Playground
-
-Before you start:
-
-- Set your plugin’s development URL to http://localhost:3000.
-- Start your plugin locally
-
- > Note: If you followed our recommendations under
- > [#create-a-development-project](#create-a-development-project), enter the
- > following command in your terminal:
- >
- > ```sh
- > yarn && yarn dev
- > ```
-
-1. Create/open a workbook.
-2. In the workbook header, click Edit.
-3. Click the + button in the sidebar, to open the workbook’s ADD NEW panel.
-4. Select the PLUGINS element type, located under UI ELEMENTS.
-5. The editor panel will show you a list of available plugins. Select Sigma
- Plugin Dev Playground.
-6. Your new plugin element will appear on the page.
-
-> **Note:**
-> The editor panel will only display content if you have configured your plugin
-> using Sigma’s plugin [Configuration API](#documentation).
-> Likewise, the element will only display content if your plugin is configured to display content.
-> If you change a plugin's configuration options, input values will need to be
-> re-added in the editor panel.
-
-**Now what?**
-
-- You can refresh your plugin as you make changes to its code. This option is
- available from the element’s menu.
-- You are responsible for hosting your plugin. [Learn more](#host-your-plugin).
-- When you’re ready to register your plugin, [Add your custom your
- Plugin](https://help.sigmacomputing.com/hc/en-us/articles/4410105794963) with
- Sigma.
-
-## Documentation
-
-#### CustomPluginConfigOptions
-
-A plugin can be configured with any number of configuration fields. Each field
-type has its own configuration options. Each field type is also guaranteed to
-have the following options:
-
-- `name : string` - the name of the field
-- `type : string` - the field type
-- `label : string (optional)` - a display name for the field
-
-
-Full CustomPluginConfigOptions Type
-
-```ts
-type CustomPluginConfigOptions =
- | {
- type: 'group';
- name: string;
- label?: string;
- }
- | {
- type: 'element';
- name: string;
- label?: string;
- }
- | {
- type: 'column';
- name: string;
- label?: string;
- allowedTypes?: ValueType[];
- source: string;
- allowMultiple: boolean;
- }
- | {
- type: 'text';
- name: string;
- label?: string;
- source?: string; // can point to a group or element config
- secure?: boolean; // if true will omit from prehydrated configs
- multiline?: boolean;
- placeholder?: string;
- defaultValue?: string;
- }
- | {
- type: 'toggle';
- name: string;
- label?: string;
- source?: string;
- defaultValue?: boolean;
- }
- | {
- type: 'checkbox';
- name: string;
- label?: string;
- source?: string;
- defaultValue?: boolean;
- }
- | {
- type: 'radio';
- name: string;
- label?: string;
- source?: string;
- values: string[];
- singleLine?: boolean;
- defaultValue?: string;
- }
- | {
- type: 'dropdown';
- name: string;
- label?: string;
- source?: string;
- width?: string;
- values: string[];
- defaultValue?: string;
- }
- | {
- type: 'color';
- name: string;
- label?: string;
- source?: string;
- }
- | {
- type: 'variable';
- name: string;
- label?: string;
- allowedTypes?: ControlType[];
- }
- | {
- type: 'interaction';
- name: string;
- label?: string;
- }
- | {
- type: 'action-trigger';
- name: string;
- label?: string;
- }
- | {
- type: 'action-effect';
- name: string;
- label?: string;
- }
- | {
- type: 'url-parameter';
- name: string;
- };
-```
-
-
-
-**Group**
-
-Can be used to identify a group of related fields
-
-**Element**
-
-A custom element that is added by your plugin
-
-**Column**
-
-A custom column configuration that your plugin uses
-
-Additional Fields
-
-- `allowedTypes : ValueType[] (optional)` - the allowed data types that this
- column can contain where `ValueType` has the following type:
-
- ```ts
- type ValueType =
- | 'boolean'
- | 'datetime'
- | 'number'
- | 'integer'
- | 'text'
- | 'variant'
- | 'link'
- | 'error';
- ```
-
-- `source : string` - the data source that should be used to supply this field
-- `allowMultiple : boolean` - whether multiple columns should be allowed as
- input for this field
-
-**Text**
-
-A configurable text input for your plugin
-
-Additional Fields
-
-- `source : string (optional)` - the data source that should be used to supply this field
-- `secure : boolean (optional)` - whether to omit input from pre-hydrated configs
-- `multiline : boolean (optional)` - whether this text input should allow
- multiple lines
-- `placeholder : string (optional)` - the placeholder for this input field
-- `defaultValue : string (optional)` - the default value for this input field
-
-**Toggle**
-
-A configurable toggle for your plugin
-
-Additional Fields
-
-- `source : string (optional)` - the data source that should be used to supply this field
-- `defaultValue : boolean (optional)` - the default value for this input field
-
-**Checkbox**
-
-A configurable checkbox for your plugin
-
-Additional Fields
-
-- `source : string (optional)` - the data source that should be used to supply this field
-- `defaultValue : boolean (optional)` - the default value for this input field
-
-**Radio**
-
-A configurable radio button for your plugin
-
-Additional Fields
-
-- `source : string (optional)` - the data source that should be used to supply
- this field
-- `values : string[]` - the options to show for this input field
-- `singleLine : boolean (optional)` - whether to display options on a single
- line. Good for (2-3) options
-- `defaultValue : boolean (optional)` - the default value for this input field
-
-**Dropdown**
-
-A configurable dropdown for your plugin
-
-Additional Fields
-
-- `source : string (optional)` - the data source that should be used to supply
- this field
-- `values : string[]` - the options to show for this input field
-- `width : string (optional)` - how wide the dropdown should be in pixels
-- `defaultValue : boolean (optional)` - the default value for this input field
-
-**Color**
-
-A configurable color picker for your plugin
-
-Additional Fields
-
-- `source : string (optional)` - the data source that should be used to supply
- this field
-
-**Variable**
-
-A configurable workbook variable to control other elements within your workbook
-
-Additional Fields
-
-- `allowedTypes : ControlType[] (optional)` - the allowed control types that this
- variable can use where `ControlType` has the following type:
-
- ```ts
- type ControlType =
- | 'boolean'
- | 'date'
- | 'number'
- | 'text'
- | 'text-list'
- | 'number-list'
- | 'date-list'
- | 'number-range'
- | 'date-range';
- ```
-
-**Interaction**
-
-A configurable workbook interaction to interact with other charts within your workbook
-
-**Action Trigger**
-
-A configurable action trigger to trigger actions in other elements within your workbook
-
-**Action Effect**
-
-A configurable action effect that can be triggered by other elements within your workbook
-
-**URL Parameter**
-
-A configurable URL parameter that can be read from and written to the browser's URL. This allows plugins to sync state with the URL for bookmarking and sharing.
-
-Additional Fields
-
-- `name : string` - The config ID used to access this URL parameter via the API
-
-#### PluginInstance
-
-```ts
-interface PluginInstance {
- sigmaEnv: 'author' | 'viewer' | 'explorer';
-
- config: {
- /**
- * Getter for entire Plugin Config
- */
- get(): Partial | undefined;
-
- /**
- * Performs a shallow merge between current config and passed in config
- */
- set(config: Partial): void;
-
- /**
- * Getter for key within plugin config
- */
- getKey(key: K): Pick;
-
- /**
- * Assigns key value pair within plugin
- */
- setKey(key: K, value: Pick): void;
-
- /**
- * Subscriber for Plugin Config
- */
- subscribe(listener: (arg0: T) => void): Unsubscriber;
-
- /**
- * Set possible options for plugin config
- */
- configureEditorPanel(options: CustomPluginConfigOptions[]): void;
-
- /**
- * Gets a static image of a workbook variable
- */
- getVariable(configId: string): WorkbookVariable;
-
- /**
- * Setter for workbook variable passed in
- */
- setVariable(configId: string, ...values: unknown[]): void;
-
- /**
- * Getter for interaction selection state
- */
- getInteraction(configId: string): WorkbookSelection[];
-
- /**
- * Setter for interaction selection state
- */
- setInteraction(
- configId: string,
- elementId: string,
- selection: WorkbookSelection[],
- ): void;
-
- /**
- * Triggers an action based on the provided action trigger ID
- */
- triggerAction(configId: string): void;
-
- /**
- * Registers an effect with the provided action effect ID
- */
- registerEffect(configId: string, effect: Function): void;
-
- /**
- * Overrider function for Config loading state
- */
- setLoadingState(isLoading: boolean): void;
-
- /**
- * Allows users to subscribe to changes in the passed in variable
- */
- subscribeToWorkbookVariable(
- configId: string,
- callback: (input: WorkbookVariable) => void,
- ): Unsubscriber;
-
- /**
- * Allows users to subscribe to changes in the url parameter
- */
- subscribeToUrlParameter(
- configId: string,
- callback: (input: UrlParameter) => void,
- ): Unsubscriber;
-
- /**
- * Gets the current value of a url parameter
- */
- getUrlParameter(configId: string): UrlParameter;
-
- /**
- * Setter for url parameter
- */
- setUrlParameter(configId: string, value: string): void;
-
- /**
- * @deprecated Use Action API instead
- * Allows users to subscribe to changes in the passed in interaction ID
- */
- subscribeToWorkbookInteraction(
- configId: string,
- callback: (input: WorkbookSelection[]) => void,
- ): Unsubscriber;
- };
-
- elements: {
- /**
- * Getter for Column Data by parent sheet ID
- */
- getElementColumns(configId: string): Promise;
-
- /**
- * Subscriber to changes in column data by ID
- */
- subscribeToElementColumns(
- configId: string,
- callback: (cols: WbElementColumns) => void,
- ): Unsubscriber;
-
- /**
- * Subscriber for the data within a given sheet
- */
- subscribeToElementData(
- configId: string,
- callback: (data: WbElementData) => void,
- ): Unsubscriber;
- };
-
- style: {
- /**
- * Subscribe to workbook style updates
- */
- subscribe(callback: (style: PluginStyle) => void): () => void;
-
- /**
- * Request current style from workbook
- */
- get(): Promise;
- };
-
- /**
- * Destroys plugin instance and removes all subscribers
- */
- destroy(): void;
-}
-```
-
-### Framework Agnostic API
-
-#### client
-
-The client is a pre-initialized plugin instance. You can use this instance
-directly or create your own instance using `initialize`
-
-```ts
-const client: PluginInstance = initialize();
-```
-
-Usage
-
-```ts
-import { client } from '@sigmacomputing/plugin';
-
-client.config.configureEditorPanel([
- { name: 'source', type: 'element' },
- { name: 'dimension', type: 'column', source: 'source', allowMultiple: true },
-]);
-```
-
-#### initialize()
-
-Instead of using the pre-initialized plugin instance, you can create your own
-plugin instance.
-
-```ts
-function initialize(): PluginInstance;
-```
-
-Usage
-
-```ts
-import { initialize } from '@sigmacomputing/plugin';
-
-const myClient: PluginInstance = initialize();
-
-myClient.config.configureEditorPanel([
- { name: 'source', type: 'element' },
- { name: 'dimension', type: 'column', source: 'source', allowMultiple: true },
-]);
-```
-
-### React API
-
-####
-
-A context provider your plugin that enables all of the other React API hooks.
-You should wrap your plugin with this provider if your want to use the plugin
-hook API.
-
-```ts
-interface SigmaClientProviderProps {
- client: PluginInstance;
- children?: ReactNode;
-}
-
-function SigmaClientProvider(props: SigmaClientProviderProps): ReactNode;
-```
-
-#### usePlugin()
-
-Gets the entire plugin instance
-
-```ts
-function usePlugin(): PluginInstance;
-```
-
-#### useEditorPanelConfig()
-
-Provides a setter for the plugin's configuration options
-
-```ts
-function useEditorPanelConfig(nextOptions: CustomPluginConfigOptions[]): void;
-```
-
-Provides a setter for the Plugin's Config Options
-
-Arguments
-
-- `nextOptions : CustomPluginConfigOptions[]` - Updated possible Config Options
-
-#### useLoadingState()
-
-Gets the current plugin's loading state and a setter. Call the setter with
-`false` when your plugin has finished loading
-
-```ts
-function useLoadingState(
- initialState: boolean,
-): [boolean, (nextState: boolean) => void];
-```
-
-Arguments
-
-- `initialState : boolean` - Initial loading state (typically `true`; then set to `false` when ready)
-
-#### useElementColumns()
-
-Provides the latest column values from corresponding sheet
-
-```ts
-function useElementColumns(elementId: string): WorkbookElementColumns;
-```
-
-Arguments
-
-- `elementId : string` - A workbook element’s unique identifier.
-
-Returns the column information from the specified element.
-
-```ts
-interface WorkbookElementColumn {
- id: string;
- name: string;
- columnType: ValueType;
-}
-
-interface WorkbookElementColumns {
- [colId: string]: WbElementColumn;
-}
+yarn build # Build all packages
+yarn test # Run all package test suites
+yarn lint # Lint the codebase
+yarn types # Type-check all packages
```
-#### useElementData()
-
-Provides the latest data values from corresponding sheet, up to 25000 values.
-
-```ts
-function useElementData(configId: string): WorkbookElementData;
-```
-
-Arguments
-
-- `configId : string` - A workbook element’s unique identifier from the plugin config.
-
-Returns the row data from the specified element.
-
-```ts
-interface WorkbookElementData {
- [colId: string]: any[];
-}
-```
-
-#### usePaginatedElementData()
-
-Provides the latest data values from the corresponding sheet (initially 25000), and provides a
-callback for fetching more data in chunks of 25000 values.
-
-```ts
-function useElementData(configId: string): [WorkbookElementData, () => void];
-```
-
-Arguments
-
-- `configId : string` - A workbook element’s unique identifier from the plugin config.
-
-Returns the row data from the specified element, and a callback for fetching
-more data.
-
-```ts
-interface WorkbookElementData {
- [colId: string]: any[];
-}
-```
-
-#### useVariable()
-
-Returns a given variable's value and a setter to update that variable
-
-```ts
-function useVariable(
- configId: string,
-): [WorkbookVariable | undefined, (...values: unknown[]) => void];
-```
-
-Arguments
-
-- `configId : string` - The config ID corresponding to the workbook control variable
-
-The returned setter function accepts 1 or more variable values expressed as an
-array or multiple parameters
-
-```ts
-function setVariableCallback(...values: unknown[]): void;
-```
-
-#### useUrlParameter()
-
-Returns a given URL parameter's value and a setter to update that URL parameter
-
-```ts
-function useUrlParameter(
- configId: string,
-): [UrlParameter | undefined, (value: string) => void];
-```
-
-Arguments
-
-- `configId : string` - The config ID corresponding to the URL parameter
-
-The returned setter function accepts a string value that will be set as the URL parameter value
-
-```ts
-function setUrlParameterCallback(value: string): void;
-```
-
-The URL parameter value has the following structure:
-
-```ts
-interface UrlParameter {
- value: string;
-}
-```
-
-Example
-
-```ts
-const [urlParam, setUrlParam] = useUrlParameter('myParamId');
-
-// Read the current value
-console.log(urlParam?.value); // e.g., "current-value"
-
-// Update the URL parameter
-setUrlParam('new-value');
-```
-
-Framework Agnostic Usage
-
-You can also use the URL parameter API without React hooks:
-
-```ts
-import { initialize } from '@sigmacomputing/plugin';
-
-const client = initialize();
-
-// Get current value
-const urlParam = client.config.getUrlParameter('myParamId');
-console.log(urlParam?.value);
-
-// Set a new value
-client.config.setUrlParameter('myParamId', 'new-value');
-
-// Subscribe to changes
-const unsubscribe = client.config.subscribeToUrlParameter(
- 'myParamId',
- urlParam => {
- console.log('URL parameter updated:', urlParam.value);
- },
-);
-```
-
-#### useInteraction()
-
-Returns a given interaction's selection state and a setter to update that interaction
-
-```ts
-function useInteraction(
- configId: string,
- elementId: string,
-): [WorkbookSelection | undefined, (value: WorkbookSelection[]) => void];
-```
-
-Arguments
-
-- `configId : string` - The config ID corresponding to the workbook interaction
-- `elementId : string` - The ID of the element that this interaction is
- associated with
-
-The returned setter function accepts an array of workbook selection elements
-
-```ts
-function setVariableCallback(value: WorkbookSelection[]): void;
-```
-
-#### useActionTrigger()
-
-- `configId : string` - The config ID corresponding to the action trigger
-
-Returns a callback function to trigger one or more action effects for a given action trigger
-
-```ts
-function useActionTrigger(configId: string): () => void;
-```
-
-#### useActionEffect()
-
-Registers and unregisters an action effect within the plugin
-
-```ts
-function useActionEffect(configId: string, effect: () => void);
-```
-
-Arguments
-
-- `configId : string` - The config ID corresponding to the action effect
-- `effect : Function` - The function to be called when the effect is triggered
-
-#### usePluginStyle()
-
-Returns style properties from the workbook.
-
-```ts
-function usePluginStyle(): PluginStyle | undefined;
-```
-
-> **Note:** Currently, the `PluginStyle` interface only supports the `backgroundColor` property, which reflects the background color set in the workbook for the plugin element.
-
-#### useConfig()
-
-Returns the workbook element’s current configuration. If a key is provided, only
-the associated configuration is returned.
-
-```ts
-function useConfig(key?: string): any;
-```
-
-Arguments
-
-- `key : string (optional)` - The name of a key within the associated
- `PluginConfigOptions` object
-
-## Examples
-
-Sigma’s development team has created a set of example plugins, listed below.
-
-All of our example plugins are hosted and can be added to your organization. To
-view / add an example plugin to your organization, follow the steps to register
-a plugin using its Production URL, listed below.
-
-You can also visit Sigma’s [Sample Plugin
-repository](https://github.com/sigmacomputing/sigma-sample-plugins) directly on
-Github.
-
-### Available Plugins
-
-- **Recharts Bar Chart** - A basic bar chart built with the Recharts library.
- - [Source Code](https://github.com/sigmacomputing/sigma-sample-plugins/tree/main/sample-plugin-bar-chart)
- - Production URL: https://sigma-sample-bar-chart-54049.netlify.app/
-
-- **D3 Candlestick** - A candlestick visualization built with D3.
- - [Source Code](https://github.com/sigmacomputing/sigma-sample-plugins/tree/main/sample-plugin-bar-chart)
- - Production URL: https://sigma-sample-candlestick-chart-1664e5.netlify.app/
-
-- **Narrative Science Quill** - Demonstrates secure text entry.
- - [Source Code]()
- - Production URL: https://narrativescience-quill-3ee312.netlify.app/
-
-- **D3 Graph** - Demonstrates usage of multiple data sources and in-memory
- joins.
- - [Source Code](https://github.com/sigmacomputing/sigma-sample-plugins/tree/main/d3-graph)
- - Production URL: https://d3-graph-3a0d0f.netlify.app/
-
-- **D3 Sunburst** - A sunburst visualization built with D3.
- - [Source Code](https://github.com/sigmacomputing/sigma-sample-plugins/tree/main/d3-sunburst)
- - Production URL: https://d3-sunburst-b97c7c.netlify.app/
-
-- **Frappe Heatmap** - A basic Frappe visualization example.
- - [Source Code](https://github.com/sigmacomputing/sigma-sample-plugins/tree/main/frappe-heatmap)
- - Production URL: https://frappe-heatmap-9a4163.netlify.app/
-
-### Use an Example in Your Organization
-
-To add an example plugin to your organization, follow the steps to [register a
-plugin](https://help.sigmacomputing.com/hc/en-us/articles/4410105794963) using
-its Production URL, listed in the [examples](#available-plugins) above.
-
-### Run an Example Locally
-
-1. Open your terminal, and navigate to the directory you want to save the example’s in.
-2. Clone Sigma’s [Sample Plugin
- repository](https://github.com/sigmacomputing/sigma-sample-plugins).
-
- ```sh
- git clone https://github.com/sigmacomputing/sigma-sample-plugins.git
- ```
-
-3. Navigate to the plugin you would like to try.
-
- ```sh
- cd sigma-sample-plugins/
- ```
-
-4. Run the plugin.
-
- ```sh
- yarn && yarn start
- ```
-
-> **Note**: For additional instructions, visit the README file located in the main directory of any given example plugin.
-
-## Host Your Plugin
-
-As a plugin developer, you are responsible for hosting your plugin(s). If you’re
-new to hosting your own projects, here are a few popular hosting platforms you
-can get started with:
-
-- [Heroku](https://devcenter.heroku.com/)
-- [Netlify](https://www.netlify.com/)
-
-## Contributing
-
-We welcome contributions to `@sigmacomputing/plugin`!
-
-🐛 Issues, 📥 Pull requests and 🌟 Stars are always welcome.
-Read our [contributing
-guide](https://github.com/sigmacomputing/plugin/blob/main/CONTRIBUTING.md) to
-get started.
-
-**yarn format**
-
-Format your code to match the sigmacomputing style guide
+## Changelog
-**yarn test**
+Release notes and breaking changes are documented in
+[CHANGELOG.md](./CHANGELOG.md).
-Check if the unit tests all pass
+## License
-> You can also run the tests in `--watch` mode with **yarn test:watch**
+[MIT](./LICENSE)
From 946acf14057f47bba63c46f7be791428cff9da4c Mon Sep 17 00:00:00 2001
From: Claude
Date: Fri, 22 May 2026 00:59:33 +0000
Subject: [PATCH 2/2] Apply oxfmt formatting to README table
https://claude.ai/code/session_01TYsJWz7wK2kDdLqd9GFJpM
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 4ed61b9..b49020c 100644
--- a/README.md
+++ b/README.md
@@ -18,8 +18,8 @@ an iframe in Sigma.
## Packages
-| Package | Description |
-| --- | --- |
+| Package | Description |
+| ------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| [`@sigmacomputing/plugin`](./packages/plugin-sdk) | Client SDK for building Sigma plugins. Provides both a standard JavaScript API and a React Hooks API. |
For installation, usage, and API documentation, see the README of each package.