How to publish the Herdex extension to the VS Code Marketplace (and, optionally, Open VSX). Everything the CI/build already handles is noted; the rest are one-time or per-release steps.
Current state:
publisherinpackage.jsonis the placeholderherdand theiconfield is unset. Both must be resolved before a real publish (see Pre-flight).
The Marketplace is backed by Azure DevOps.
- Sign in at https://marketplace.visualstudio.com/manage with a Microsoft account.
- Create publisher → pick a publisher ID (lowercase, unique, e.g.
mkellerman) and a display name. The ID is permanent and becomes part of the extension id‹publisher›.vscode-herdr. - Set it in
package.json:Keep therepository,bugs, andhomepageURLs in sync with the real repo.
- Go to https://dev.azure.com (same Microsoft account) → User settings → Personal access tokens → New Token.
- Organization: All accessible organizations. Expiration: your call.
- Scopes: Custom defined → Marketplace → Manage (only that).
- Copy the token — it's shown once. Store it in a password manager.
- Locally: you'll pass it per publish (or
vsce login <publisher>once). - CI (recommended): add it as a GitHub Actions secret named
VSCE_PAT(repo → Settings → Secrets and variables → Actions → New repository secret). Thepublishjob in.github/workflows/ci.ymlalready reads it.
Do these before the first publish:
-
publisherset to your real publisher ID (notherd). - Icon — add a 128×128+ PNG (SVG is not allowed for the gallery icon),
e.g.
media/icon.png, and set"icon": "media/icon.png"inpackage.json.⚠️ Decide branding first: shipping Herdr's logo/name may be a trademark issue — the README already frames Herdex as an unofficial/community client. - Screenshots/GIF in the README (replace the
<!-- TODO -->placeholders). This is the single biggest factor in whether people install. -
README.mdreads well as the Marketplace page (it's rendered verbatim) and states "requires Herdr installed and running." -
CHANGELOG.mdhas an entry for the version you're shipping. - Version in
package.jsonis correct (SemVer) and not already published. - Green build:
pnpm run typecheck && pnpm run lint && pnpm run test. - Sanity-check the package contents:
npx @vscode/vsce ls(should bedist/extension.js,package.json,README,LICENSE,CHANGELOG,media/**— nosrc,test,node_modules, or lockfiles).
The git tag is the single source of truth for the version. With VSCE_PAT set as a
repo secret, publishing is just tagging:
git tag v0.1.1 # the version to publish (SemVer, with a leading v)
git push origin v0.1.1Pushing a v* tag triggers the publish job in .github/workflows/ci.yml, which
derives the version from the tag (v0.1.1 → 0.1.1), sets it in package.json for
the build (npm version … --no-git-tag-version), packages herdex-<version>.vsix, and runs
vsce publish.
Because the version comes from the tag, the
versionin a committedpackage.jsonis just a dev placeholder — you don't need to bump it to release. Do keepCHANGELOG.mdupdated with an entry for the version you're tagging. For a pre-release, tag e.g.v0.2.0-beta.1(and add--pre-releaseto the vsce step if you want it flagged pre-release on the Marketplace).
pnpm run package # -> herdex-<version>.vsix (build + vsce package)
# authenticate once, then publish the built vsix:
npx @vscode/vsce login <publisher> # paste the PAT when prompted
npx @vscode/vsce publish --packagePath herdex-<version>.vsix
# …or publish + bump the version in one step (creates a git commit + tag):
npx @vscode/vsce publish patch -p "$VSCE_PAT" # minor | major | <version>After publishing, the listing appears at
https://marketplace.visualstudio.com/items?itemName=<publisher>.vscode-herdr
(indexing can take a few minutes).
Many editors that aren't official VS Code use the Open VSX registry. Since Herdex targets AI-agent users (some on Cursor/VSCodium), consider publishing there too:
- Create an account at https://open-vsx.org and an access token.
npx ovsx publish herdex-<version>.vsix -p <OPEN_VSX_TOKEN>
(You may need to create the namespace once: npx ovsx create-namespace <publisher> -p <token>.)
- SemVer. Patch = fixes, minor = features, major = breaking. Pre-1.0, breaking
changes can ride minor bumps, but keep the
CHANGELOGhonest. - The git tag is the source of truth (tag-driven). To release, tag
vX.Y.Zand push it — CI stamps that version into the build and publishes. UpdateCHANGELOG.mdbefore tagging. (Publishing locally withvsce publish <version>still works if you prefer, but the tag path avoids version drift.) - Protocol coupling: Herdex targets Herdr wire protocol
EXPECTED_PROTOCOL(seesrc/runtime/types.ts, currently 17). If Herdr bumps its protocol, re-runherdr api schema --json, reconciledocs/research/herdr-socket-api.md, update the constant, and ship a release.
ERROR Missing publisher name— setpublisherinpackage.json.401 Unauthorized— PAT wrong/expired, or not Marketplace → Manage scope, or not scoped to all accessible organizations.ERROR ... icon ... must be a PNG— theiconfield must point to a PNG.- Relative-link warning about
docs/...— vsce resolves README links againstrepository; it's set, so this should be quiet. If it complains, the link target isn't in the repo or the URL is wrong. - Version already exists — you can't republish the same version; bump it.
vsce/ovsxnot found — the scripts usenpx @vscode/vsce;@vscode/vsceis also a devDependency, sopnpm installprovides it locally.