diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 9dc194b..e02e23a 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "postman", - "version": "1.3.0", + "version": "1.3.1", "description": "Full API lifecycle management for Claude Code. Sync collections, generate client code, discover APIs, run tests, create mocks, publish docs, and audit security. Powered by the Postman MCP Server.", "author": { "name": "Postman", diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..dee010a --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,13 @@ +# Code owners / default PR reviewers. +# +# GitHub auto-requests these reviewers when a pull request is opened as — or +# marked — "ready for review". Draft PRs do not trigger a request. +# +# These are the individual members of the @postman-eng/postman-api team. The +# team itself cannot be referenced here: CODEOWNERS only supports teams that +# belong to the same org as the repo (Postman-Devrel), and postman-api lives in +# the postman-eng org. Keep this list in sync with that team manually. +# +# NOTE: Each user must have at least read access to this repo, otherwise GitHub +# silently skips them as a code owner. +* @akira28 @garciasdos @christosgkoros @shruti-paranjape @alexander-rubia @rubenbaraut diff --git a/.github/workflows/plugin-checks.yml b/.github/workflows/plugin-checks.yml index bd76f16..4014703 100644 --- a/.github/workflows/plugin-checks.yml +++ b/.github/workflows/plugin-checks.yml @@ -57,3 +57,24 @@ jobs: with: python-version: "3.12" - run: python .github/scripts/validate-structure.py + + version-sync: + name: Version Sync + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Verify .mcp.json version matches plugin.json version + run: | + PLUGIN_VERSION=$(python -c "import json; print(json.load(open('.claude-plugin/plugin.json'))['version'])") + MCP_PLUGIN_VERSION=$(python -c "import json; print(json.load(open('.mcp.json'))['mcpServers']['postman']['headers']['X-Plugin-Version'])") + MCP_USER_AGENT=$(python -c "import json; print(json.load(open('.mcp.json'))['mcpServers']['postman']['headers']['User-Agent'])") + echo "plugin.json: $PLUGIN_VERSION" + echo ".mcp.json X-Plugin-Version: $MCP_PLUGIN_VERSION" + echo ".mcp.json User-Agent: $MCP_USER_AGENT" + if [ "$MCP_PLUGIN_VERSION" != "$PLUGIN_VERSION" ] || [ "$MCP_USER_AGENT" != "postman-claude-code-plugin/$PLUGIN_VERSION" ]; then + echo "::error::.mcp.json version headers do not match plugin.json version $PLUGIN_VERSION. Update X-Plugin-Version and User-Agent in .mcp.json to match plugin.json." + exit 1 + fi diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e43d1e1..0e91074 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,6 +26,19 @@ jobs: exit 1 fi + - name: Verify .mcp.json version matches plugin.json version + run: | + PLUGIN_VERSION=$(python -c "import json; print(json.load(open('.claude-plugin/plugin.json'))['version'])") + MCP_PLUGIN_VERSION=$(python -c "import json; print(json.load(open('.mcp.json'))['mcpServers']['postman']['headers']['X-Plugin-Version'])") + MCP_USER_AGENT=$(python -c "import json; print(json.load(open('.mcp.json'))['mcpServers']['postman']['headers']['User-Agent'])") + echo "plugin.json: $PLUGIN_VERSION" + echo ".mcp.json X-Plugin-Version: $MCP_PLUGIN_VERSION" + echo ".mcp.json User-Agent: $MCP_USER_AGENT" + if [ "$MCP_PLUGIN_VERSION" != "$PLUGIN_VERSION" ] || [ "$MCP_USER_AGENT" != "postman-claude-code-plugin/$PLUGIN_VERSION" ]; then + echo "::error::.mcp.json version headers do not match plugin.json version $PLUGIN_VERSION. Update X-Plugin-Version and User-Agent in .mcp.json before tagging." + exit 1 + fi + - name: Extract release notes from CHANGELOG id: notes run: | diff --git a/.mcp.json b/.mcp.json index bf8ba33..c48b7c8 100644 --- a/.mcp.json +++ b/.mcp.json @@ -5,8 +5,8 @@ "url": "https://mcp.postman.com/${POSTMAN_MCP_MODE:-mcp}", "headers": { "X-Source": "claude-code-plugin", - "X-Plugin-Version": "1.2.0", - "User-Agent": "postman-claude-code-plugin/1.2.0" + "X-Plugin-Version": "1.3.1", + "User-Agent": "postman-claude-code-plugin/1.3.1" } } } diff --git a/CHANGELOG.md b/CHANGELOG.md index 065328b..a314332 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,20 @@ is cut by tagging the matching `vX.Y.Z` (see [Releasing](#releasing)). ## [Unreleased] +## [1.3.1] - 2026-08-02 + +### Changed + +- README now recommends installing from Anthropic's official plugin marketplace + (`/plugin install postman@claude-plugins-official`), with GitHub and local-clone + installs moved to collapsible alternatives. + +### Fixed + +- Bumped the `X-Plugin-Version` and `User-Agent` headers in `.mcp.json` to match + `plugin.json` (they had drifted to `1.2.0`). The release workflow now fails if + these versions ever fall out of sync again. + ## [1.3.0] - 2026-07-20 ### Added diff --git a/CLAUDE.md b/CLAUDE.md index 8f31dd4..e9fd496 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -78,5 +78,6 @@ CLI commands work with Postman's git sync structure: `postman/collections/` (v3 - The plugin follows [Semantic Versioning](https://semver.org). `version` in `.claude-plugin/plugin.json` is the single source of truth - Every user-facing change bumps the version and adds an entry under `## [Unreleased]` in `CHANGELOG.md` (added a command/skill → minor; fix/tweak → patch; breaking change → major) -- To release: bump `plugin.json`, move `[Unreleased]` notes into a dated `## [X.Y.Z]` section, merge to `main`, then `git tag vX.Y.Z && git push origin vX.Y.Z` -- The `Release` GitHub Actions workflow (`.github/workflows/release.yml`) triggers on `v*` tags: it fails if the tag doesn't match `plugin.json`, extracts the matching CHANGELOG section, and publishes a GitHub Release with those notes +- When bumping `plugin.json`, also update the `X-Plugin-Version` and `User-Agent` headers in `.mcp.json` to the same version — these are sent to the Postman MCP Server for telemetry and must stay in sync +- To release: bump `plugin.json` and the matching `.mcp.json` version headers, move `[Unreleased]` notes into a dated `## [X.Y.Z]` section, merge to `main`, then `git tag vX.Y.Z && git push origin vX.Y.Z` +- The `Release` GitHub Actions workflow (`.github/workflows/release.yml`) triggers on `v*` tags: it fails if the tag doesn't match `plugin.json` or if `.mcp.json`'s version headers don't match `plugin.json`, extracts the matching CHANGELOG section, and publishes a GitHub Release with those notes diff --git a/README.md b/README.md index 3b869d0..c98d11f 100644 --- a/README.md +++ b/README.md @@ -13,11 +13,27 @@ The Postman Plugin provides a single, simple install for Claude Code. It provide ## Installation -Install directly from GitHub: +Install from Anthropic's official plugin marketplace. + +In Claude Code: + +``` +/plugin install postman@claude-plugins-official +``` + +Or from the terminal: + +```bash +claude plugin install postman@claude-plugins-official +``` + +
+Alternative: install from GitHub ```bash claude plugin install github:Postman-Devrel/postman-claude-code-plugin ``` +
Alternative: load from a local clone