Skip to content
Merged
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
20 changes: 20 additions & 0 deletions .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "testerarmy-agent-skills",
"interface": {
"displayName": "TesterArmy"
},
"plugins": [
{
"name": "testerarmy",
"source": {
"source": "local",
"path": "./"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Developer Tools"
}
]
}
1 change: 1 addition & 0 deletions .github/workflows/validate-plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ on:
- ".claude-plugin/**"
- ".codex-plugin/**"
- ".cursor-plugin/**"
- ".agents/plugins/**"
- "assets/**"
- "server.json"
- "scripts/check-plugin-manifests.sh"
Expand Down
13 changes: 12 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,18 @@ Cursor: open Customize and search for `testerarmy`, or click Add to Cursor on th
}
```

This repo is also a Claude Code plugin that installs the MCP server and the `testerarmy-cli` skill together: run `/plugin marketplace add tester-army/cli`, then `/plugin install testerarmy@testerarmy-agent-skills`.
This repo is also a plugin that installs the MCP server and the `testerarmy-cli` skill together.

Claude Code: run `/plugin marketplace add tester-army/cli`, then `/plugin install testerarmy@testerarmy-agent-skills`.

Codex: the repo is a plugin marketplace too, so until TesterArmy appears in the Plugins Directory you can add it from here:

```bash
codex plugin marketplace add tester-army/cli
codex plugin add testerarmy@testerarmy-agent-skills
```

The plugin registers the hosted server for you; sign in once with `codex mcp login testerarmy`, or accept the sign-in prompt the ChatGPT app shows at install. In the ChatGPT desktop app, open this repository in Codex and the marketplace appears as a source in the Plugins tab.

Full reference for the server and its tools: https://docs.tester.army/cli/mcp

Expand Down
11 changes: 9 additions & 2 deletions scripts/check-plugin-manifests.sh
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
#!/usr/bin/env bash
# Keeps the plugin manifests and the MCP Registry manifest (server.json) in step. Run locally or in CI.
# Keeps the plugin manifests, the Codex repo marketplace and the MCP Registry manifest (server.json) in step. Run locally or in CI.
set -euo pipefail
cd "$(dirname "$0")/.."

files=(.claude-plugin/plugin.json .claude-plugin/marketplace.json .codex-plugin/plugin.json .cursor-plugin/plugin.json plugin.json .mcp.json mcp.json server.json)
files=(.claude-plugin/plugin.json .claude-plugin/marketplace.json .codex-plugin/plugin.json .cursor-plugin/plugin.json plugin.json .mcp.json mcp.json server.json .agents/plugins/marketplace.json)
for f in "${files[@]}"; do jq -e . "$f" >/dev/null || { echo "invalid JSON: $f"; exit 1; }; done

# name, version and description must match across every manifest and the marketplace entry
ref_name=$(jq -r .name plugin.json)
for key in name version description; do
ref=$(jq -r ".$key" plugin.json)
for f in .claude-plugin/plugin.json .codex-plugin/plugin.json .cursor-plugin/plugin.json; do
Expand All @@ -32,6 +33,12 @@ u2=$(jq -r '.mcpServers.testerarmy.url' mcp.json)
[ "$(jq -r .version server.json)" = "$(jq -r .version plugin.json)" ] || { echo "version differs in server.json (bump it with the plugin manifests)"; exit 1; }
[ "$(jq -r '.remotes[0].url' server.json)" = "$u1" ] || { echo "server.json remotes[0].url differs from the MCP files"; exit 1; }

# the Codex repo marketplace (.agents/plugins/marketplace.json, read by `codex plugin marketplace add tester-army/cli`
# and by the ChatGPT app) must point at this plugin under the same name as the Claude marketplace
[ "$(jq -r '.plugins[0].name' .agents/plugins/marketplace.json)" = "$ref_name" ] || { echo "Codex marketplace plugin name differs from plugin.json"; exit 1; }
[ "$(jq -r '.plugins[0].source.path' .agents/plugins/marketplace.json)" = "./" ] || { echo "Codex marketplace must reference the repo root (./)"; exit 1; }
[ "$(jq -r .name .agents/plugins/marketplace.json)" = "$(jq -r .name .claude-plugin/marketplace.json)" ] || { echo "Codex and Claude marketplace names differ"; exit 1; }

# referenced logo must exist
for p in "$(jq -r .logo .cursor-plugin/plugin.json)" "$(jq -r .interface.logo .codex-plugin/plugin.json)"; do
[ -f "${p#./}" ] || { echo "missing logo file: $p"; exit 1; }
Expand Down
Loading