Skip to content

Commit 758169b

Browse files
Rodriguespnclaude
andcommitted
test: verify each vendor is installable via the plugins CLI + native Grok CLI
Add per-vendor installability checks to the plugin-manifest validation workflow: - install-via-plugins matrix runs the vendor-neutral `plugins` CLI once per supported target (claude-code, cursor, codex, grok, kimi, github-copilot), forcing each with --target and asserting the plugin installs. Grok and Copilot legs install their native CLIs first; the rest install file-based. Gemini is excluded (not a `plugins` CLI target — it ships as a Gemini extension). - install-via-grok-cli exercises Grok Build's own `grok plugin install`, independent of the plugins CLI, confirming Grok's native path works. Kimi has no headless native install (`/plugins install` is an interactive TUI command); its only programmatic installer is the `plugins` CLI, which writes Kimi's native store directly — so that path is covered by the matrix above. Also drop the two vendor-specific MCP notes from AGENTS.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 95c27e8 commit 758169b

2 files changed

Lines changed: 88 additions & 7 deletions

File tree

.github/workflows/validate-plugin-manifests.yml

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,13 @@ on:
55
branches:
66
- main
77

8+
env:
9+
# Pin the vendor-neutral installer so CI is deterministic; bump intentionally.
10+
PLUGINS_CLI_VERSION: "1.3.4"
11+
812
jobs:
913
validate:
10-
name: Validate Claude plugin manifests
14+
name: Validate Claude plugin manifest
1115
runs-on: ubuntu-latest
1216

1317
steps:
@@ -22,3 +26,85 @@ jobs:
2226
- name: Validate plugin manifest
2327
run: npx -y @anthropic-ai/claude-code plugin validate .claude-plugin/plugin.json
2428

29+
install-via-plugins:
30+
# Verify every supported vendor is installable through the vendor-neutral
31+
# `plugins` CLI (https://www.npmjs.com/package/plugins). One leg per agent,
32+
# forced with --target so we exercise exactly that vendor's surface.
33+
# Gemini is intentionally omitted: it is not a `plugins` CLI target (it ships
34+
# as a Gemini extension via gemini-extension.json).
35+
name: Install via plugins CLI (${{ matrix.target }})
36+
runs-on: ubuntu-latest
37+
strategy:
38+
fail-fast: false
39+
matrix:
40+
# Target ids per the plugins CLI docs (Supported targets table).
41+
target:
42+
- claude-code
43+
- cursor
44+
- codex
45+
- grok
46+
- kimi
47+
- github-copilot
48+
49+
env:
50+
NO_COLOR: "1"
51+
DO_NOT_TRACK: "1"
52+
53+
steps:
54+
- name: Check out repository
55+
uses: actions/checkout@v4
56+
57+
- name: Set up Node.js
58+
uses: actions/setup-node@v4
59+
with:
60+
node-version: 20
61+
62+
# Grok and Copilot install through their native CLIs, so those binaries
63+
# must be present. The other targets are installed file-based and need no
64+
# extra tooling.
65+
- name: Install Grok Build CLI
66+
if: matrix.target == 'grok'
67+
run: |
68+
curl -fsSL https://x.ai/cli/install.sh | GROK_BIN_DIR="$HOME/.grokbin" bash
69+
echo "$HOME/.grokbin" >> "$GITHUB_PATH"
70+
71+
- name: Install GitHub Copilot CLI
72+
if: matrix.target == 'github-copilot'
73+
run: npm install -g @github/copilot
74+
75+
- name: Install Supabase plugin via plugins CLI
76+
run: |
77+
npx -y "plugins@${PLUGINS_CLI_VERSION}" add . --target "${{ matrix.target }}" --yes 2>&1 | tee install.log
78+
grep -q "Installed" install.log
79+
80+
install-via-grok-cli:
81+
# Verify the plugin also installs through Grok Build's own CLI
82+
# (`grok plugin install`), independent of the plugins CLI. Grok natively
83+
# prefers .grok-plugin/plugin.json.
84+
#
85+
# Kimi Code has no equivalent headless native install: `/plugins install` is
86+
# an interactive TUI slash-command, and Kimi's only programmatic installer is
87+
# the `plugins` CLI (covered above), which writes Kimi's native plugin store
88+
# directly without invoking a `kimi` binary.
89+
name: Install via native Grok CLI
90+
runs-on: ubuntu-latest
91+
92+
env:
93+
NO_COLOR: "1"
94+
95+
steps:
96+
- name: Check out repository
97+
uses: actions/checkout@v4
98+
99+
- name: Install Grok Build CLI
100+
run: |
101+
curl -fsSL https://x.ai/cli/install.sh | GROK_BIN_DIR="$HOME/.grokbin" bash
102+
echo "$HOME/.grokbin" >> "$GITHUB_PATH"
103+
104+
- name: Validate and install with grok plugin install
105+
run: |
106+
grok plugin validate .
107+
grok plugin install . --trust 2>&1 | tee grok-install.log
108+
grep -qi "supabase" grok-install.log
109+
grok plugin list 2>&1 | tee grok-list.log
110+
grep -qi "supabase" grok-list.log

AGENTS.md

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,12 @@ Keep this repository focused on the shared multi-vendor plugin layout:
1616
- `.cursor-plugin/plugin.json` defines the Cursor plugin surface
1717
- `.codex-plugin/plugin.json` defines the Codex plugin surface
1818
- `.grok-plugin/plugin.json` defines the Grok Build plugin surface
19-
- `.kimi-plugin/plugin.json` defines the Kimi Code plugin surface (with its MCP server declared inline — see below)
19+
- `.kimi-plugin/plugin.json` defines the Kimi Code plugin surface (with its MCP server declared inline)
2020
- `.github/plugin/plugin.json` defines the GitHub Copilot plugin surface
2121
- `agents/claude/.mcp.json`, `agents/cursor/mcp.json`, `agents/grok/mcp.json`, `agents/codex/.app.json`, and `agents/copilot/.mcp.json` hold agent-specific MCP config files
2222
- `gemini-extension.json` defines the Gemini extension manifest
2323
- `skills/` contains the shipped, real skill files consumed by the supported plugin surfaces
2424

25-
Two vendor-specific MCP notes:
26-
27-
- **Grok Build** natively prefers `.grok-plugin/plugin.json` over `.claude-plugin/plugin.json` (verified against `grok` `v0.2.101`), so it gets its own manifest pointing at `agents/grok/mcp.json` (`X-Source-Name: grok-plugin`). This holds whether it is installed through the `plugins` CLI (which stages the whole repo) or via `grok plugin install`. Grok resolves the `mcpServers` file-path reference.
28-
- **Kimi Code is the one exception to the "MCP config lives in `agents/<vendor>/`" convention.** Kimi's plugin loader evaluates `mcpServers` as an inline object (`Object.entries(manifest.mcpServers)`), so a path string is iterated character-by-character and breaks — it cannot reference an external file. The Supabase MCP server (`X-Source-Name: kimi-plugin`) is therefore declared **inline** in `.kimi-plugin/plugin.json`, and there is intentionally no `agents/kimi/mcp.json`. When updating the shared MCP URL or headers, remember to edit the inline block in `.kimi-plugin/plugin.json` as well.
29-
3025
This repo should stay self-contained. Claude marketplace installs copy the plugin into Claude's local cache, so paths outside the plugin root are fragile and should be avoided.
3126

3227
## Important Commands

0 commit comments

Comments
 (0)