Skip to content
Closed
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
2 changes: 1 addition & 1 deletion .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
},
"metadata": {
"description": "Coder plugins for Cursor",
"version": "0.2.0",
"version": "0.3.0",
"pluginRoot": "plugins"
},
"plugins": [
Expand Down
2 changes: 1 addition & 1 deletion .github/scripts/sync-skills-vendor.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"repo": "coder/skills",
"pin": "e439e4bf0e9b517292adaac92d1c1b029810603c",
"pin": "3c998377afa72c4d03503468196721ef3c772d7f",
"paths": [
"skills/setup",
"skills/templates",
Expand Down
5 changes: 3 additions & 2 deletions .github/workflows/validate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,10 @@ jobs:
run: |
set -euo pipefail
PLUGIN=$(jq -er '.version' plugins/coder/.cursor-plugin/plugin.json)
PORTABLE=$(jq -er '.version' plugins/coder/plugin.json)
MARKET=$(jq -er '.metadata.version' .cursor-plugin/marketplace.json)
if [ "$PLUGIN" != "$MARKET" ]; then
echo "::error::plugin.json is $PLUGIN but marketplace.json is $MARKET"
if [ "$PLUGIN" != "$MARKET" ] || [ "$PLUGIN" != "$PORTABLE" ]; then
echo "::error::.cursor-plugin/plugin.json is $PLUGIN, plugin.json is $PORTABLE, marketplace.json is $MARKET"
exit 1
fi
if ! printf '%s' "$PLUGIN" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$'; then
Expand Down
23 changes: 15 additions & 8 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
```text
.cursor-plugin/marketplace.json Marketplace manifest
plugins/coder/ The Coder plugin
.cursor-plugin/plugin.json Plugin manifest (canonical version)
plugin.json Agent Plugins 1.0 manifest (portable)
.cursor-plugin/plugin.json Cursor manifest (canonical version)
.cursor-plugin/mcp.json Coder remote MCP server (Cursor only, used by /coder-agent)
CHANGELOG.md Release history
mcp.json Coder remote MCP server (used by /coder-agent)
skills/ vendored coder/skills (workspaces, setup, templates, modules)
commands/ /coder-agent
assets/logo.svg
Expand All @@ -21,22 +22,28 @@ scripts/validate-template.mjs Manifest and frontmatter validation
2. Edit the plugin. Vendored skill directories are regenerated by the sync
script; change them in [coder/skills](https://github.com/coder/skills)
instead. See [VENDOR.md](VENDOR.md).
3. Validate:
3. Keep `plugins/coder/plugin.json` and `.cursor-plugin/plugin.json` in
step: `name`, `version`, `description`, `author`, `homepage`,
`repository`, `license`, and `keywords` must be identical. Cursor-only
fields (`displayName`, `logo`, `variables`) go in the Cursor manifest
only, because `plugin.json` is a closed schema.
4. Validate:

```sh
node scripts/validate-template.mjs
```

4. Test locally by copying `plugins/coder` to `~/.cursor/plugins/local/coder`
5. Test locally by copying `plugins/coder` to `~/.cursor/plugins/local/coder`
and reloading Cursor.
5. Open a pull request. Use conventional commit titles
6. Open a pull request. Use conventional commit titles
(`feat:`, `fix:`, `chore:`, `docs:`).

## Releasing

1. Bump `version` in `plugins/coder/.cursor-plugin/plugin.json` and
`metadata.version` in `.cursor-plugin/marketplace.json` to the same value.
The `validate` workflow fails if they differ.
1. Bump `version` in `plugins/coder/.cursor-plugin/plugin.json`,
`plugins/coder/plugin.json`, and `metadata.version` in
`.cursor-plugin/marketplace.json` to the same value. The `validate`
workflow fails if they differ.
2. Add an entry to `plugins/coder/CHANGELOG.md` for the new version.
3. Merge to `main`. The `release` workflow tags `vX.Y.Z` and publishes a
GitHub Release when the version has no existing tag.
Expand Down
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,20 @@ whatever session the `coder` CLI already has from `coder login`.
| "Set up Coder on this VM." | Uses the `setup` skill to install and bootstrap a deployment. |
| "Delegate this refactor to a Coder Agent and tell me when it's done." | Creates a Coder Agents chat with `coder_create_chat` and waits with `coder_await_chat`. |

## Other agents

The plugin is also an [Agent Plugins 1.0](https://github.com/agentplugins/agent-plugins-spec)
package (`plugins/coder/plugin.json`), so clients that support the standard,
such as Codex and GitHub Copilot, can load the four skills. The skills work
the same everywhere.

The Coder MCP server and `/coder-agent` are Cursor-only. Every deployment has
its own URL, and the standard allows no placeholder in an MCP `url`, so the
server is declared in `.cursor-plugin/mcp.json` with Cursor's `${CODER_URL}`
plugin variable. The portable package has no root `mcp.json`, so other
clients load the skills and ignore the server. Commands are not part of the
standard either.

## Self-hosted and air-gapped deployments

Everything in this plugin operates against your own deployment. Nothing is
Expand Down
5 changes: 3 additions & 2 deletions VENDOR.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,9 @@ to `main`.
node .github/scripts/sync-skills.mjs
```

3. Bump `version` in `plugins/coder/.cursor-plugin/plugin.json` and
`metadata.version` in `.cursor-plugin/marketplace.json`. Cursor skips
3. Bump `version` in `plugins/coder/.cursor-plugin/plugin.json`,
`plugins/coder/plugin.json`, and `metadata.version` in
`.cursor-plugin/marketplace.json`. Cursor skips
installs whose version has not changed.
4. Add an entry to `plugins/coder/CHANGELOG.md` for the new version.
5. Run `node scripts/validate-template.mjs`.
Expand Down
File renamed without changes.
3 changes: 2 additions & 1 deletion plugins/coder/.cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "coder",
"displayName": "Coder",
"version": "0.2.0",
"version": "0.3.0",
"description": "Skills for installing, configuring, and operating a self-hosted Coder deployment from the Cursor IDE, plus the Coder MCP server for managing and using the deployment: workspaces, templates, and Coder Agents.",
"author": {
"name": "Coder",
Expand All @@ -24,6 +24,7 @@
"devops"
],
"logo": "assets/logo.svg",
"mcpServers": ".cursor-plugin/mcp.json",
"variables": {
"type": "object",
"properties": {
Expand Down
7 changes: 7 additions & 0 deletions plugins/coder/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# Changelog

## 0.3.0

- Made the plugin an [Agent Plugins 1.0](https://github.com/agentplugins/agent-plugins-spec) package so Codex, GitHub Copilot, and other conformant clients can load it: added a portable `plugin.json` next to `.cursor-plugin/plugin.json`.
- Re-vendored `coder/skills` at `3c99837`: the `workspaces` skill is now named `workspaces`, matching its directory, as the Agent Skills spec requires. It was `coder-workspaces`.
- `scripts/validate-template.mjs` now checks `plugin.json`, `mcp.json`, skill names, and that both manifests agree. CI also requires all three versions to match.
- Moved the Coder MCP server from `mcp.json` to `.cursor-plugin/mcp.json`, referenced by `mcpServers` in the Cursor manifest. Its URL uses the `${CODER_URL}` plugin variable, which Agent Plugins does not allow in `url`, so the server and `/coder-agent` work only in Cursor. Other clients no longer see an invalid MCP entry.

## 0.2.0

- Added the Coder remote MCP server (`mcp.json`) and the `/coder-agent` command for delegating tasks to Coder Agents chats. Requires Coder v2.38 or later, with the `mcp-server-http` experiment and `CODER_OAUTH2_PROVIDER_ENABLE=true`.
Expand Down
4 changes: 3 additions & 1 deletion plugins/coder/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ and using the deployment: workspaces, templates, and Coder Agents.

## Included

- `plugin.json`: Agent Plugins 1.0 manifest, the portable metadata read by any conformant client
- `.cursor-plugin/plugin.json`: Cursor manifest, which adds `displayName`, `logo`, `mcpServers`, and the `CODER_URL` variable
- `skills/workspaces/`, `skills/setup/`, `skills/templates/`, `skills/modules/`: vendored from [coder/skills](https://github.com/coder/skills)
- `mcp.json`: Coder remote MCP server at `${CODER_URL}/api/experimental/mcp/http`, where `${CODER_URL}` is the plugin variable the user sets under **Configure** (not a shell environment variable). Gives the agent Coder's tools for workspaces, templates, files, and Coder Agents chats; `/coder-agent` builds on it.
- `.cursor-plugin/mcp.json`: Coder remote MCP server (Cursor only; referenced by `mcpServers` in the Cursor manifest) at `${CODER_URL}/api/experimental/mcp/http`, where `${CODER_URL}` is the plugin variable the user sets under **Configure** (not a shell environment variable). Gives the agent Coder's tools for workspaces, templates, files, and Coder Agents chats; `/coder-agent` builds on it.
- `commands/coder-agent.md`: delegate a task to a Coder Agent and supervise it, through MCP

See the [repository README](../../README.md) for setup and usage, and
Expand Down
26 changes: 26 additions & 0 deletions plugins/coder/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "coder",
"version": "0.3.0",
"description": "Skills for installing, configuring, and operating a self-hosted Coder deployment from the Cursor IDE, plus the Coder MCP server for managing and using the deployment: workspaces, templates, and Coder Agents.",
"author": {
"name": "Coder",
"email": "support@coder.com",
"url": "https://coder.com"
},
"homepage": "https://coder.com",
"repository": "https://github.com/coder/cursor-plugin",
"license": "MIT",
"keywords": [
"coder",
"cloud development environments",
"remote development",
"workspaces",
"terraform",
"templates",
"mcp",
"self-hosted",
"ai agents",
"devops"
]
}
2 changes: 1 addition & 1 deletion plugins/coder/skills/workspaces/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
name: coder-workspaces
name: workspaces
description: >
Use an existing Coder deployment from the command line with the
`coder` CLI: list, inspect, create, start, stop, and delete
Expand Down
Loading
Loading