Release process
Edit this pageTwo artifacts ship from this one repository:
| Artifact | Consumed by | Source of truth |
|---|---|---|
npm package mcp-vibelens | every MCP client (npx -y mcp-vibelens@1) | package.json |
Claude Code plugin vibelens | claude plugin install vibelens@vibelens | plugin/.claude-plugin/plugin.json + .claude-plugin/marketplace.json + plugin/.mcp.json |
The plugin's .mcp.json launches the npm package, so npm must be published
first. A plugin release without a matching npm version installs but cannot
start the server.
One-time setup#
1. Create the GitHub repository#
gh repo create VibeLens --public --source=. --remote=origin \
--description "MCP server that gives AI coding assistants eyes on localhost"
git push -u origin main2. Claim the npm name#
vibelens-mcp and vibelens are already taken on npm by unrelated projects, so
this package publishes as mcp-vibelens. Confirm it is still free before the
first publish:
npm view mcp-vibelens version # should 404If you would rather ship under your own scope, change name in package.json
to @<your-npm-user>/vibelens and update the args in .mcp.json plus the IDE
snippets in README.md to match. scripts/validate-manifests.mjs enforces that
they stay in sync, so CI will catch a half-done rename.
3. Add the npm token to GitHub#
Create an Automation access token at npmjs.com → Access Tokens, then:
gh secret set NPM_TOKENAutomation tokens bypass 2FA, which the publish workflow needs. Granular tokens also work; classic "Publish" tokens do not if you have 2FA-on-publish enabled.
Every release#
Bump the version in both places. They must match or CI fails:
bashnpm version 1.0.1 --no-git-tag-version # package.json # then edit plugin/.claude-plugin/plugin.json → "version": "1.0.1"Claude Code resolves the plugin version from
plugin.jsonand only serves an update to existing users when that string changes. Forgetting it means nobody gets the new version.Verify locally.
bashnpm run typecheck npm test # 63 tests, real Chromium npm run build node scripts/smoke.mjs # spawns dist/ over real stdio node scripts/validate-manifests.mjs npm run validate:plugin # claude plugin validate . npm pack --dry-run # confirm only dist/ + docs shipCommit, tag and push. The tag is what triggers publishing:
bashgit add -A git commit -m "release: v1.0.1" git tag v1.0.1 git push origin main --tags.github/workflows/release.ymlre-runs the full verification, checks the tag againstpackage.json, and publishes with--provenance.Confirm the publish.
bashnpm view mcp-vibelens version npx -y mcp-vibelens@latest --help 2>&1 | head -3 # should start and log to stderrConfirm the plugin path. In a scratch directory:
bashclaude plugin marketplace update vibelens claude plugin install vibelens@vibelensThen in a session:
/mcpshould listvibelensas connected, and/vibelens:check-ui http://localhost:3000should run against a live dev server.Cut GitHub release notes.
bashgh release create v1.0.1 --generate-notes
Optional: submit to the community marketplace#
Anthropic reviews third-party plugins for the claude-community marketplace.
Run claude plugin validate . first (the review pipeline runs the same check),
then submit via https://platform.claude.com/plugins/submit. Approved plugins
are pinned to a commit SHA and the pin advances automatically as you push.
Rollback#
npm forbids republishing a version number. To pull a bad release:
npm deprecate mcp-vibelens@1.0.1 "Broken release, use 1.0.2"Then publish a fixed patch version. npm unpublish is only available within 72
hours and breaks anyone who already installed it — prefer deprecate plus a fix.