Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions CONTEXT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# pluginpack

pluginpack compiles one authored source of agent plugins into the plugin
layouts and catalogs each AI client expects.

## Language

### Authoring

**Source**:
A directory holding one plugin's shared, client-neutral content.
_Avoid_: shared plugin, source plugin (that term names the legacy 0.10 discovered-plugin model)

**Overrides**:
A per-target directory applied after a source, adding or replacing files for one target.
_Avoid_: target overlay, targets/ replacements

**Content kind**:
A selectable category of source content: a component directory, `static`, or `mcp`.
_Avoid_: component (when `static` or `mcp` is meant)

### Output

**Target**:
One output configuration that pluginpack builds, named for the client or format it serves.
_Avoid_: host, adapter (in config), platform

**Package**:
One plugin directory laid out to the Agent Plugins specification: `plugin.json`, `skills/`, `mcp.json`, and any extension directories.
_Avoid_: portable plugin, AP plugin

**Client profile**:
A client's additions to a package: its extension namespace, the manifest data under it, and the files in its extension directory.
_Avoid_: overlay, flavor

**Extension namespace**:
The reverse-domain key a client owns inside a package, such as `com.openai`.
_Avoid_: vendor key, client key

**Marketplace**:
A client's catalog file listing installable plugins, such as `.agents/plugins/marketplace.json`. Not part of a package.
_Avoid_: registry, index, catalog (as a term)

**MCP dialect**:
The plugin-root and plugin-data variable names and transport labels one client's MCP config expects.
_Avoid_: MCP format, MCP flavor

**Artifact**:
The in-memory map of every file one target build emits, plus which paths pluginpack manages.
_Avoid_: output bundle
26 changes: 18 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -342,17 +342,27 @@ shared/acme/mcp/
}
```

Pluginpack translates the configuration into each target's native MCP layout.
The MCP source and tests remain in `mcp/`; only declared shipping files are
emitted. Add `"mcp"` to `exclude` to omit the complete capability for a target.

| Target | How MCP is wired |
| ------------- | -------------------------------------------------------- |
| `claude` | ships `.mcp.json` at the plugin root (auto-discovered) |
| `cursor` | ships `.mcp.json`, referenced from `plugin.json` |
| `codex` | ships `.mcp.json`, referenced from `plugin.json` |
| `copilot` | ships `.mcp.json`, referenced from the marketplace entry |
| `antigravity` | writes `mcp_config.json` beside `plugin.json` |
Author `config.json` once, in either the
[Agent Plugins](https://agent-plugins.org/specification) form (an explicit
`type` per server, `${PLUGIN_ROOT}` / `${PLUGIN_DATA}`) or the Claude-style
form (`type` optional, `${CLAUDE_PLUGIN_ROOT}`). Pluginpack renders it into
each target's MCP dialect, so you don't need a per-target `config.json`
override just to change a variable name:

| Target | File | Plugin root / data variables | Transport labels |
| ------------- | -------------------------------------------- | ------------------------------------------------- | ------------------------------------------------------ |
| `claude` | `.mcp.json` at the plugin root | `${CLAUDE_PLUGIN_ROOT}` / `${CLAUDE_PLUGIN_DATA}` | `streamable-http` becomes `http` |
| `cursor` | `.mcp.json`, referenced from `plugin.json` | `${CURSOR_PLUGIN_ROOT}` / none (a build error) | `type` dropped for stdio and HTTP (Cursor infers them) |
| `copilot` | `.mcp.json`, referenced from the marketplace | `${PLUGIN_ROOT}` / as authored | `streamable-http` becomes `http` |
| `codex` | `.mcp.json`, referenced from `plugin.json` | as authored | as authored |
| `antigravity` | `mcp_config.json` beside `plugin.json` | as authored | as authored |

A `./bin/server` command becomes `${<root variable>}/bin/server` for targets
whose clients don't resolve plugin-relative commands. Config already written in
a target's own dialect is emitted unchanged.

## Legacy Additional Plugin-Root Files

Expand Down
18 changes: 18 additions & 0 deletions docs/adr/0001-codex-emits-agent-plugins-packages.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
status: accepted
---

# Codex emits Agent Plugins packages by default, with no dual layout

OpenAI's packaging docs make the Agent Plugins root `plugin.json` (OpenAI
settings under `extensions.com.openai`) the preferred format and keep
`.codex-plugin/plugin.json` only as a fallback. From 0.12.0 the `codex` target
therefore emits Agent Plugins packages by default. A `format: "legacy"` option
keeps the old layout for one release window, for users on Codex older than
v0.146.

We deliberately do not emit both layouts in one build. A dual layout would need
two MCP files in different shapes (`mcp.json` and `.mcp.json`) and a
`.codex-plugin` overlay that current Codex ignores whenever
`extensions.com.openai` is present. That doubles what can drift, only to serve
older clients.
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading