{"id":51094809,"url":"https://github.com/gleanwork/pluginpack","last_synced_at":"2026-06-24T05:30:53.324Z","repository":{"id":361502864,"uuid":"1254514316","full_name":"gleanwork/pluginpack","owner":"gleanwork","description":"Compile one source of agent plugins - skills, commands, hooks, and MCP servers - into the native plugin format each AI app expects.","archived":false,"fork":false,"pushed_at":"2026-06-15T00:54:03.000Z","size":320,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-15T02:26:34.828Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gleanwork.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-30T16:59:50.000Z","updated_at":"2026-06-15T00:54:07.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/gleanwork/pluginpack","commit_stats":null,"previous_names":["gleanwork/pluginpack"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gleanwork/pluginpack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gleanwork%2Fpluginpack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gleanwork%2Fpluginpack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gleanwork%2Fpluginpack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gleanwork%2Fpluginpack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gleanwork","download_url":"https://codeload.github.com/gleanwork/pluginpack/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gleanwork%2Fpluginpack/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34719082,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-24T05:30:52.633Z","updated_at":"2026-06-24T05:30:53.315Z","avatar_url":"https://github.com/gleanwork.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pluginpack\n\n[![Experimental](https://img.shields.io/badge/-Experimental-D8FD49?style=flat-square\u0026logo=data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMzIgMzIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0yNC4zMDA2IDIuOTU0MjdMMjAuNzY1NiAwLjE5OTk1MUwxNy45MDI4IDMuOTk1MjdDMTMuNTY1MyAxLjkzNDk1IDguMjMwMTkgMy4wODQzOSA1LjE5Mzk0IDcuMDA5ODNDMS42NTg4OCAxMS41NjQyIDIuNDgzIDE4LjExMzggNy4wMzczOCAyMS42NDg5QzguNzcyMzggMjIuOTkzNSAxMC43ODkzIDIzLjcwOTIgMTIuODI3OSAyMy44MTc3QzE2LjE0NjEgMjQuMDEyOCAxOS41MDc3IDIyLjYyNDggMjEuNjc2NSAxOS44MDU1QzI0LjczNDQgMTUuODggMjQuNTE3NSAxMC40MTQ4IDIxLjQ1OTYgNi43Mjc4OUwyNC4zMDA2IDIuOTU0MjdaTTE4LjExOTcgMTcuMDUxMkMxNi4xMDI4IDE5LjYzMiAxMi4zNzI1IDIwLjEwOTEgOS43NzAwMSAxOC4wOTIyQzcuMTg5MTkgMTYuMDc1MiA2LjcxMjA3IDEyLjMyMzMgOC43MjkwMSA5Ljc0MjQ2QzkuNzA0OTQgOC40ODQ1OCAxMS4xMTQ2IDcuNjgyMTQgMTIuNjc2MSA3LjQ4Njk2QzEzLjA0NDggNy40NDM1OCAxMy40MTM1IDcuNDIxOSAxMy43ODIyIDcuNDQzNThDMTQuOTc1IDcuNTA4NjUgMTYuMTI0NCA3Ljk0MjM5IDE3LjA3ODcgOC42Nzk3N0MxOS42NTk1IDEwLjcxODQgMjAuMTM2NiAxNC40NzAzIDE4LjExOTcgMTcuMDUxMloiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik0yNC41MTc2IDIxLjY5MjJDMjMuOTMyIDIyLjQ1MTMgMjMuMjgxNCAyMy4xMjM2IDIyLjU2NTcgMjMuNzUyNUMyMS44NzE3IDI0LjMzODEgMjEuMTEyNyAyNC44ODAzIDIwLjMxMDIgMjUuMzM1N0MxOS41Mjk1IDI1Ljc2OTUgMTguNjgzNyAyNi4xMzgyIDE3LjgzNzggMjYuNDIwMUMxNi45OTIgMjYuNzAyIDE2LjEwMjggMjYuODk3MiAxNS4yMTM3IDI3LjAwNTdDMTQuMzI0NSAyNy4xMTQxIDEzLjQzNTMgMjcuMTU3NSAxMi41MjQ0IDI3LjA5MjRDMTEuNjEzNSAyNy4wMjczIDEwLjcyNDMgMjYuODc1NSA5Ljg1Njg0IDI2LjY1ODdMOS42NjE2NSAyNy4zNzQzTDguNzcyNDYgMzAuOTk2MkM5LjkwMDIxIDMxLjI5OTggMTEuMDQ5NyAzMS40NzMzIDEyLjIyMDggMzEuNTZDMTIuMjY0MiAzMS41NiAxMi4zMjkyIDMxLjU2IDEyLjM3MjYgMzEuNTZDMTMuNTAwMyAzMS42MjUxIDE0LjY0OTggMzEuNTgxNyAxNS43NTU4IDMxLjQ1MTZDMTYuOTI3IDMxLjI5OTggMTguMDk4MSAzMS4wMzk1IDE5LjIyNTggMzAuNjcwOEMyMC4zNTM2IDMwLjMwMjIgMjEuNDU5NyAyOS44MjUgMjIuNTAwNyAyOS4yMzk1QzIzLjU2MzQgMjguNjUzOSAyNC41NjEgMjcuOTM4MiAyNS40OTM1IDI3LjE1NzVDMjYuNDQ3OCAyNi4zNTUgMjcuMzE1MyAyNS40NDQyIDI4LjA3NDQgMjQuNDQ2NUMyOC4xODI4IDI0LjMxNjQgMjguMjY5NSAyNC4xNjQ2IDI4LjM3OCAyNC4wMTI4TDI0Ljc3NzkgMjEuMzQ1MkMyNC42Njk0IDIxLjQ1MzcgMjQuNjA0NCAyMS41ODM4IDI0LjUxNzYgMjEuNjkyMloiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPg==\u0026labelColor=343CED)](https://github.com/gleanwork/.github/blob/main/docs/repository-stability.md#experimental)\n[![npm version](https://img.shields.io/npm/v/@gleanwork/pluginpack.svg)](https://www.npmjs.com/package/@gleanwork/pluginpack)\n[![CI](https://github.com/gleanwork/pluginpack/actions/workflows/ci.yml/badge.svg)](https://github.com/gleanwork/pluginpack/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nOne source of truth for agent plugins across AI app ecosystems.\n\n`pluginpack` is a build tool for compiling portable skills, commands, agents, rules, hooks, assets, and metadata into the native plugin layouts expected by each AI app. It copies files, writes target manifests, and validates generated output; it is not a package manager or publisher.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/pluginpack-flow.svg\" alt=\"pluginpack packages source components into Claude, Cursor, Antigravity, and Copilot plugin targets\"\u003e\n\u003c/p\u003e\n\n## Quick Start\n\nStart with portable plugin components, declare the native targets you want, then run `pluginpack build`.\n\n```bash snippet=readme/snippet-01.bash\nnpm install -D @gleanwork/pluginpack\n```\n\nCreate repo-level component directories:\n\n```tree\nskills/\n  release-notes/\n    SKILL.md\nagents/\n  search-assistant.md\ncommands/\n  summarize.md\nrules/\n  style.mdc\nhooks/\n  before-run.sh\nassets/\n  icon.png\npluginpack.config.ts\n```\n\nAdd a config that maps that portable source into native plugin outputs. `source.skills` gives the repo a simple portable install surface; sibling component directories are included when the selected target supports them or when you opt into them with `components`.\n\n```ts snippet=readme/snippet-02.ts\nimport { defineConfig } from \"@gleanwork/pluginpack\";\n\nexport default defineConfig({\n  name: \"acme-plugins\",\n  version: \"0.1.0\",\n  source: {\n    skills: \"skills\",\n    rootPlugin: {\n      id: \"core\",\n      description: \"Acme portable skills.\",\n    },\n  },\n  metadata: {\n    description: \"Acme agent plugins.\",\n    author: { name: \"Acme\" },\n    license: \"MIT\",\n  },\n  targets: {\n    cursor: {\n      outDir: \".\",\n      plugins: {\n        acme: {\n          from: [\"core\"],\n          path: \"plugins/cursor/acme\",\n        },\n      },\n    },\n    claude: {\n      outDir: \".\",\n      pluginRoot: \"plugins/claude\",\n      plugins: {\n        acme: { from: [\"core\"] },\n      },\n    },\n    antigravity: {\n      outDir: \"plugins/antigravity\",\n      plugins: {\n        acme: { from: [\"core\"] },\n      },\n    },\n    copilot: {\n      outDir: \"plugins/copilot\",\n      plugins: {\n        acme: { from: [\"core\"] },\n      },\n    },\n  },\n});\n```\n\nBuild and validate the generated outputs:\n\n```bash\nnpx pluginpack build\nnpx pluginpack validate --target cursor\n```\n\nUsers who only want portable skills install from the `skills/` subpath, for example `npx skills add owner/repo/skills --skill '*'`. Claude, Cursor, Antigravity, and Copilot users install from the generated native layout that can include skills, agents, rules, hooks, assets, MCP config, and target-specific manifests.\n\n## Mental Model\n\nAgent apps increasingly support similar ideas: skills, commands, agents, rules, hooks, MCP configuration, and plugin marketplaces. The packaging formats are different enough that maintaining one repo per app quickly drifts.\n\n`pluginpack` does four things:\n\n- reads a portable source plugin from your repo\n- copies selected component directories into each target\n- writes the manifests each target expects\n- validates, diffs, prunes, and cleans generated output\n\nIt does not try to make every app behave the same. Target adapters own target-specific layout, manifests, and validation.\n\n## Recommended Shape\n\nThe preferred path is one public plugin repository with top-level component directories. `skills/` remains the portable `skills` CLI install surface, while the other component directories feed native plugin outputs.\n\n```tree\nskills/\n  release-notes/\n    SKILL.md\nagents/\n  search-assistant.md\ncommands/\n  summarize.md\nrules/\n  style.mdc\nhooks/\n  before-run.sh\nassets/\n  icon.png\npluginpack.config.ts\n\n.cursor-plugin/\n  marketplace.json\nplugins/\n  cursor/\n    acme/\n      .cursor-plugin/plugin.json\n      agents/\n      rules/\n      hooks/\n      skills/\n  claude/\n    acme/\n      .claude-plugin/plugin.json\n      agents/\n      hooks/\n      skills/\n  antigravity/\n    .pluginpack/\n      antigravity.json\n    acme/\n      mcp_config.json\n      plugin.json\n      agents/\n      rules/\n      hooks/\n      skills/\n  copilot/\n    .claude-plugin/\n      marketplace.json\n    .github/\n      plugin/\n        marketplace.json\n    .pluginpack/\n      copilot.json\n    plugins/\n      acme/\n        agents/\n        hooks/\n        skills/\n.claude-plugin/\n  marketplace.json\n.pluginpack/\n  cursor.json\n  claude.json\n```\n\n`source.skills` points at the repo-level skills directory and creates a root source plugin from the sibling component directories. `source.rootPlugin.id` creates the source plugin name used by each target's `from` array. The repo root is intentionally also home to generated native plugin outputs, so the `skills/` subpath keeps `skills` CLI discovery focused on the canonical portable skills.\n\n`pluginpack` writes a `.pluginpack/\u003ctarget\u003e.json` managed-file manifest for each built target. That manifest lets builds and cleanup commands remove stale generated files without touching source files or unmanaged repo content.\n\n## Components\n\nIn `pluginpack`, a component is a top-level plugin capability directory. Components are the portable pieces of a source plugin that may or may not exist in every target ecosystem.\n\nSupported component directories are:\n\n```txt\nskills/\nagents/\ncommands/\nrules/\nhooks/\nscripts/\nassets/\npolicies/\nthemes/\n```\n\nTarget adapters translate those component directories into each app's native layout and manifest fields. Each target has a smart default component list. By default, `claude`, `cursor`, `antigravity`, and `copilot` emit skills and other native plugin support files but omit `commands`, since those ecosystems increasingly expose skills as slash commands.\n\nUse `components` only when a plugin needs an exact target-specific component set:\n\n```ts snippet=readme/snippet-03.ts\nimport { defineConfig } from \"@gleanwork/pluginpack\";\n\nexport default defineConfig({\n  name: \"acme-plugins\",\n  version: \"0.1.0\",\n  source: {\n    skills: \"skills\",\n    rootPlugin: {\n      id: \"core\",\n      description: \"Acme portable skills.\",\n    },\n  },\n  metadata: {\n    description: \"Acme agent plugins.\",\n    author: { name: \"Acme\" },\n    license: \"MIT\",\n  },\n  targets: {\n    antigravity: {\n      outDir: \"plugins/antigravity\",\n      plugins: {\n        acme: { from: [\"core\"], components: [\"skills\", \"commands\"] },\n      },\n    },\n    claude: {\n      outDir: \"plugins/claude\",\n      plugins: {\n        acme: { from: [\"core\"], components: [\"skills\"] },\n      },\n    },\n  },\n});\n```\n\n## Targets\n\nEach target compiles the same source into one app's native plugin layout:\n\n| Target        | Native format                                                                 | Output it writes                                                                                                 |\n| ------------- | ----------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |\n| `cursor`      | Cursor plugin + marketplace                                                   | `.cursor-plugin/marketplace.json`; a `.cursor-plugin/plugin.json` per plugin                                     |\n| `claude`      | Claude plugin + marketplace                                                   | `.claude-plugin/marketplace.json`; a `.claude-plugin/plugin.json` per plugin                                     |\n| `antigravity` | Antigravity CLI plugin                                                        | a `plugin.json` per plugin + optional `mcp_config.json` (no marketplace)                                         |\n| `copilot`     | [GitHub Copilot plugins](https://github.com/github/copilot-plugins)           | `.claude-plugin/marketplace.json` mirrored to `.github/plugin/marketplace.json`; plugins under `plugins/\u003cname\u003e/` |\n| `codex`       | [OpenAI Codex CLI plugins](https://developers.openai.com/codex/plugins/build) | `.agents/plugins/marketplace.json`; a `.codex-plugin/plugin.json` per plugin + optional `.mcp.json`              |\n\n\u003e **Heads up:** `claude` and `copilot` both write `.claude-plugin/marketplace.json`, so they need distinct `outDir`s (or separate repos). `build` errors on overlapping output paths.\n\nNew targets are added from official docs or real plugin examples — not guessed abstractions.\n\n## Source Plugins\n\nThe quick-start shape treats repo-level component directories as one source plugin. For more complex source content, keep source plugins under `plugins/` and emit them into one or more target outputs:\n\n```tree\nplugins/\n  core/\n    plugin.pluginpack.json\n    .mcp.json\n    skills/\n      release-notes/\n        SKILL.md\n    agents/\n    commands/\n    rules/\n    hooks/\n    assets/\n```\n\nA target can emit a source plugin directly, rename it, or merge multiple source plugins into one emitted plugin.\n\n## MCP Servers\n\nA source plugin declares MCP servers with a standard `.mcp.json` file at its root (`{ \"mcpServers\": { \"name\": { ... } } }`), or with an `mcpServers` key in `plugin.pluginpack.json`. The file wins if both are present, and merging plugins with the same server name is an error.\n\nEach target wires that MCP config into its native shape:\n\n| Target        | How MCP is wired                                         |\n| ------------- | -------------------------------------------------------- |\n| `claude`      | ships `.mcp.json` at the plugin root (auto-discovered)   |\n| `cursor`      | ships `.mcp.json`, referenced from `plugin.json`         |\n| `codex`       | ships `.mcp.json`, referenced from `plugin.json`         |\n| `copilot`     | ships `.mcp.json`, referenced from the marketplace entry |\n| `antigravity` | writes `mcp_config.json` beside `plugin.json`            |\n\n## Target Overrides\n\nSkill files are not always perfectly portable. When one app needs different frontmatter or content, add a target override next to the base file:\n\n```txt\nskills/release-notes/SKILL.md\nskills/release-notes/targets/cursor/SKILL.md\nskills/release-notes/targets/claude/SKILL.md\n```\n\nResolution order is target override first, then the base file.\n\n## Other Shapes\n\nThere are two reasonable alternatives when the single-repo shape is not enough:\n\n- Single source repo, multiple output repos: best when each target ecosystem expects its own repo root shape.\n- Single source repo, release artifacts: best when users install zipped plugin payloads or release assets instead of browsing generated files in Git.\n\n## Why Not Just Copy Files?\n\nFor one target, copying files by hand may be enough. `pluginpack` starts to earn its keep when you need deterministic manifests, target-specific overrides, validation, and CI checks across multiple target repos.\n\n## CI Change Detection\n\n`pluginpack diff` is designed for automation. It builds into a temporary directory, compares generated managed files against an existing plugin repo, and exits non-zero when the plugin repo is stale:\n\n```bash snippet=readme/snippet-04.bash\npluginpack diff --target cursor --against ../cursor-plugins\npluginpack diff --target claude --against ../claude-plugins\n```\n\nUse that in CI to fail clearly or to trigger an action that opens a PR against the generated plugin repo.\n\nWhen a generated target repo intentionally owns a path, add `ignoredDiffPaths` to that target config. Entries are target-output-relative paths; a directory entry ignores everything below it.\n\nTo publish a repo-root file (for example a README authored once in the source repo) into a target's output, add `rootFiles` to that target config — a map of output path to source path (relative to the config root). Emitted root files are managed like any other generated file, so an output repo's README stays synced from source instead of hand-maintained per repo.\n\n## Configuration Reference\n\n`pluginpack.config.ts` exports a config object (wrap it in `defineConfig` for types). `src/schema.ts` is the source of truth; this table enumerates every field. Paths marked _safe relative_ reject absolute paths and `..` escapes.\n\n**Top level**\n\n| Field      | Type   | Required | Meaning                                                                    |\n| ---------- | ------ | -------- | -------------------------------------------------------------------------- |\n| `name`     | string | yes      | Marketplace/source name written into generated manifests.                  |\n| `version`  | string | yes      | Default version stamped into manifests (per-target/plugin overridable).    |\n| `source`   | object | no       | Where source plugins come from (see **`source`**).                         |\n| `metadata` | object | no       | Shared metadata merged into manifests (see **`metadata`**).                |\n| `targets`  | object | yes      | Per-target output config, keyed by target name (see **`targets.\u003cname\u003e`**). |\n\n**`source`**\n\n| Field        | Type   | Required | Meaning                                                                                                                                                                      |\n| ------------ | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `plugins`    | string | no       | Directory to discover source plugins from. Defaults to `plugins`.                                                                                                            |\n| `skills`     | string | no       | Repo-level skills directory; creates a root source plugin from sibling component dirs.                                                                                       |\n| `rootPlugin` | object | no       | Metadata for that root skills plugin. Accepts all **`metadata`** fields plus `id`, `name`, `description`. `id` is the source-plugin name used in each target's `from` array. |\n\n**`metadata`** (and `source.rootPlugin`)\n\n| Field         | Type                     | Meaning                              |\n| ------------- | ------------------------ | ------------------------------------ |\n| `displayName` | string                   | Human-readable name.                 |\n| `description` | string                   | Short description.                   |\n| `author`      | `{ name, email?, url? }` | Author identity (`name` required).   |\n| `owner`       | `{ name, email?, url? }` | Marketplace owner (`name` required). |\n| `homepage`    | string                   | Homepage URL.                        |\n| `repository`  | string                   | Repository URL.                      |\n| `license`     | string                   | SPDX license id.                     |\n| `logo`        | string                   | Logo path or URL.                    |\n| `keywords`    | string[]                 | Marketplace keywords.                |\n| `category`    | string                   | Marketplace category.                |\n| `tags`        | string[]                 | Free-form tags.                      |\n\n**`targets.\u003cname\u003e`** — `\u003cname\u003e` is one of `cursor`, `claude`, `antigravity`, `copilot`, `codex`.\n\n| Field              | Type                   | Required | Meaning                                                                                  |\n| ------------------ | ---------------------- | -------- | ---------------------------------------------------------------------------------------- |\n| `outDir`           | string                 | yes      | Output directory for this target, relative to the config root.                           |\n| `plugins`          | record                 | yes      | Emitted plugins, keyed by emitted plugin name (see **`targets.\u003cname\u003e.plugins.\u003cname\u003e`**). |\n| `marketplaceDir`   | string (safe relative) | no       | Override the marketplace dir (defaults: `.cursor-plugin` / `.claude-plugin`).            |\n| `pluginRoot`       | string (safe relative) | no       | Override the plugin root dir (`claude`; defaults to `plugins`).                          |\n| `version`          | string                 | no       | Override the version for this target (defaults to top-level `version`).                  |\n| `manifest`         | object                 | no       | Deep-merged into the generated marketplace manifest.                                     |\n| `ignoredDiffPaths` | string[]               | no       | Output-relative paths `diff` ignores (a dir entry ignores everything below it).          |\n| `rootFiles`        | record (safe relative) | no       | Map of output path → source path emitted verbatim at the output root.                    |\n\n**`targets.\u003cname\u003e.plugins.\u003cname\u003e`**\n\n| Field         | Type                   | Required | Meaning                                                                                                                                                                                          |\n| ------------- | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `from`        | string[] (min 1)       | yes      | Source plugin ids to merge into this emitted plugin.                                                                                                                                             |\n| `path`        | string (safe relative) | no       | Output path for the plugin, relative to `outDir`. Defaults to the plugin name (or `pluginRoot/\u003cname\u003e` for `claude`).                                                                             |\n| `version`     | string                 | no       | Per-plugin version override.                                                                                                                                                                     |\n| `displayName` | string                 | no       | Per-plugin display name.                                                                                                                                                                         |\n| `description` | string                 | no       | Per-plugin description override.                                                                                                                                                                 |\n| `manifest`    | object                 | no       | Deep-merged into the generated plugin manifest.                                                                                                                                                  |\n| `entry`       | object                 | no       | Deep-merged into the generated marketplace entry (the object in the marketplace `plugins` array). Use for target-specific entry fields pluginpack can't derive — e.g. Codex `policy`/`category`. |\n| `components`  | string[]               | no       | Exact component set, overriding the target's smart default.                                                                                                                                      |\n\n## Programmatic API\n\nEverything the CLI does is exported from the package entry, so you can script builds (the [`pluginpack-action`](https://github.com/gleanwork/pluginpack-action) consumes these directly):\n\n```ts\nimport {\n  defineConfig,\n  loadConfig,\n  build,\n  diffTarget,\n  validateOutput,\n  prune,\n  clean,\n} from \"@gleanwork/pluginpack\";\n```\n\n| Function                        | Returns                     | Purpose                                                          |\n| ------------------------------- | --------------------------- | ---------------------------------------------------------------- |\n| `defineConfig(config)`          | `PluginpackConfig`          | Identity helper that types `pluginpack.config.ts`.               |\n| `loadConfig(cwd?, configPath?)` | `Promise\u003cResolvedProject\u003e`  | Resolve config and discover source plugins.                      |\n| `build(options?)`               | `Promise\u003cArtifact[]\u003e`       | Emit configured targets; writes to disk unless `options.dryRun`. |\n| `diffTarget(options)`           | `Promise\u003cDiffResult\u003e`       | Build into a temp dir and compare against an existing repo.      |\n| `validateOutput(target, dir)`   | `Promise\u003cValidationResult\u003e` | Validate an existing target output directory.                    |\n| `prune(options?)`               | `Promise\u003cCleanupResult[]\u003e`  | Remove stale managed files no longer emitted by the config.      |\n| `clean(options?)`               | `Promise\u003cCleanupResult[]\u003e`  | Remove all managed files for configured targets.                 |\n\nOption objects:\n\n- `build` — `{ cwd?, configPath?, target?, outDir?, dryRun? }`\n- `diffTarget` — `{ cwd?, configPath?, target, against }`\n- `prune` / `clean` — `{ cwd?, configPath?, target?, dryRun?, force? }`\n\nThe result and config types (`Artifact`, `DiffResult`/`DiffEntry`, `ValidationResult`/`ValidationIssue`, `CleanupResult`/`CleanupEntry`, `ResolvedProject`, `PluginpackConfig`, `TargetConfig`, `TargetName`, …) are all exported for use in TypeScript.\n\n\u003c!-- pluginpack-cli:start --\u003e\n\n## CLI Reference\n\n### `init`\n\nCreate a starter pluginpack.config.ts and source plugin layout.\n\n```bash\npluginpack init [options]\n```\n\nExamples:\n\n- `pluginpack init`\n\nExit codes:\n\n- 0 when files are created\n- 1 when files already exist or cannot be written\n\n### `build`\n\nCompile configured source plugins into target-native plugin payloads.\n\n```bash\npluginpack build [--target cursor|claude|antigravity|copilot|codex] [--out-dir \u003cpath\u003e] [--dry-run]\n```\n\nOptions:\n\n- `--target \u003ctarget\u003e`: Build only one configured target.\n- `--out-dir \u003cpath\u003e`: Override the configured output directory for the selected target.\n- `--dry-run`: Resolve and print planned managed output paths without writing files.\n\nExamples:\n\n- `pluginpack build`\n- `pluginpack build --target cursor`\n- `pluginpack build --target claude --dry-run`\n\nExit codes:\n\n- 0 when all selected targets build\n- 1 when config, source resolution, or file output fails\n\n### `validate`\n\nValidate an existing target output directory for native manifest, path, and frontmatter requirements.\n\n```bash\npluginpack validate --target cursor|claude|antigravity|copilot|codex [--dir \u003cpath\u003e]\n```\n\nOptions:\n\n- `--target \u003ctarget\u003e`: Required target validator.\n- `--dir \u003cpath\u003e`: Directory to validate. Defaults to the configured target outDir.\n\nExamples:\n\n- `pluginpack validate --target cursor --dir ../cursor-plugins`\n\nExit codes:\n\n- 0 when validation passes\n- 1 when validation finds errors\n\n### `diff`\n\nBuild into a temporary directory and compare generated managed files with an existing target repo.\n\n```bash\npluginpack diff --target cursor|claude|antigravity|copilot|codex --against \u003cpath\u003e\n```\n\nOptions:\n\n- `--target \u003ctarget\u003e`: Required target to build and compare.\n- `--against \u003cpath\u003e`: Existing target repo or output directory to compare against.\n\nExamples:\n\n- `pluginpack diff --target cursor --against ../cursor-plugins`\n\nExit codes:\n\n- 0 when managed files match\n- 1 when managed files differ or the command fails\n\n### `prune`\n\nRemove stale managed files that are no longer emitted by the current config.\n\n```bash\npluginpack prune [--target cursor|claude|antigravity|copilot|codex] [--dry-run]\n```\n\nOptions:\n\n- `--target \u003ctarget\u003e`: Prune only one configured target.\n- `--dry-run`: Print stale managed files without deleting them.\n- `--force`: Delete even paths that resolve inside the source tree or config.\n\nExamples:\n\n- `pluginpack prune`\n- `pluginpack prune --target claude --dry-run`\n\nExit codes:\n\n- 0 when stale managed files are removed or listed\n- 1 when config, source resolution, or cleanup fails\n\n### `clean`\n\nRemove all managed files for configured target outputs.\n\n```bash\npluginpack clean [--target cursor|claude|antigravity|copilot|codex] [--dry-run]\n```\n\nOptions:\n\n- `--target \u003ctarget\u003e`: Clean only one configured target.\n- `--dry-run`: Print managed files without deleting them.\n- `--force`: Delete even paths that resolve inside the source tree or config.\n\nExamples:\n\n- `pluginpack clean`\n- `pluginpack clean --target cursor --dry-run`\n\nExit codes:\n\n- 0 when managed files are removed or listed\n- 1 when config, manifest loading, or cleanup fails\n\n### `docs`\n\nGenerate the README CLI reference section from command metadata.\n\n```bash\npluginpack docs [options]\n```\n\nOptions:\n\n- `--check`: Fail if README.md is not up to date.\n\nExamples:\n\n- `pluginpack docs`\n- `pluginpack docs --check`\n\nExit codes:\n\n- 0 when docs are current or updated\n- 1 when --check finds stale docs\n\u003c!-- pluginpack-cli:end --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgleanwork%2Fpluginpack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgleanwork%2Fpluginpack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgleanwork%2Fpluginpack/lists"}