Publishing & Releases β
How wiremd ships. Four artifacts ship together under a single version: the npm package, the VS Code extension, the Claude skill, and a standalone CLI bundle. The repo is a pnpm + Turborepo monorepo; releases are coordinated from packages/core/.
Artifacts β
| Artifact | Source workspace | Distributed via |
|---|---|---|
wiremd npm package | packages/core/ | npm registry |
| VS Code extension | extensions/vscode/ | VS Code Marketplace + GitHub Release .vsix |
| Claude skill (wireframe) | extensions/skills/wireframe/ | npx skills add teezeit/wiremd/extensions/skills + GitHub Release zip |
| Standalone CLI bundle | built from packages/core/src/cli/ | GitHub Release (releases/wiremd.js, also bundled into the Claude skill) |
CI/CD pipelines β
| Workflow | Trigger | What it does |
|---|---|---|
ci.yml | push to main, PRs | Build / typecheck / lint / test on Node 20 + 22 across Linux/macOS/Windows; coverage upload; package shape check |
build-bundle.yml | push to main (touching core/skills/extension src or scripts/build-bundle.mjs), manual | Rebuild the standalone CLI bundle + .vsix; commit the refreshed plugin bin back to main; refresh the rolling latest GitHub prerelease |
docs.yml | push to main (touching apps/** or packages/core/src/**), manual | Build VitePress docs + landing + editor; deploy the merged tree to GitHub Pages |
release.yml | tag push (v*) | Create the GitHub Release with auto-generated notes |
publish.yml | release published | Build everything, publish the VS Code extension to the Marketplace via VSCE_PAT, publish the npm package via NPM_TOKEN, and attach wireframe-skill.zip to the release |
The npm package is published automatically by publish.yml when a GitHub Release is published.
Pre-release checklist β
- [ ]
pnpm turbo run testis green - [ ]
pnpm turbo run typecheckis clean - [ ]
pnpm turbo run lintis clean - [ ]
CHANGELOG.mdhas an entry under[Unreleased] - [ ] Documentation reflects the changes (see the Feature Development Checklist in
CONTRIBUTING.md) - [ ] The version bump follows semver β pre-1.0, minor bumps may include breaking changes
Cutting a release β
The version in packages/core/package.json is the source of truth. The repo-root package.json's version lifecycle hook runs scripts/sync-versions.mjs to propagate it to:
extensions/vscode/package.jsonextensions/skills/wireframe/.claude-plugin/plugin.json
β¦and stages those files automatically. Do not bump those by hand.
# 1. Sanity check
pnpm turbo run test
# 2. Bump version (must run inside packages/core/)
cd packages/core
npm version patch # or minor / major
# β edits packages/core/package.json,
# runs sync-versions.mjs (stages vscode + skill plugin.json),
# commits, and tags.
# 3. Push branch + tag
git push && git push --tagsPushing the tag fires:
release.ymlβ creates the GitHub release with auto-generated notes.publish.ymlβ builds the VS Code extension, publishes it to the Marketplace, publishes the npm package, and attacheswireframe-skill.zipto the release.
No manual steps are needed in GitHub or the VS Code Marketplace.
Extension-only release β
If only the VS Code extension changes and you don't want to bump the npm package, bump the extension independently:
cd extensions/vscode
npm version patch
git push && git push --tagsThen create the GitHub release for that tag manually. publish.yml fires on the release: published event and pushes the new .vsix to the Marketplace.
npm publishing β
publish.yml publishes the wiremd npm package automatically after the GitHub Release is published:
- The workflow checks out the release tag.
- It installs dependencies and builds the monorepo.
- It runs
npm publish --access public --provenancefrompackages/core/. - It uses the
NPM_TOKENrepository secret for registry authentication.
Only publish manually if the release workflow cannot be used.
NPM token setup β
The automated publish step requires:
- An npm token with publish rights for
wiremd(npm settings β Tokens). Use an Automation token for CI. - The token added to GitHub: Settings β Secrets and variables β Actions β New repository secret, name
NPM_TOKEN. publishConfig.access: "public"is already set inpackages/core/package.json.
Frontend deploys (docs / editor / landing) β
docs.yml deploys all three frontend apps to GitHub Pages on every push to main that touches apps/docs/**, apps/editor/**, apps/landing/**, packages/core/src/**, or the workflow itself. The job:
- Builds
packages/core/(the editor and docs depend on its types and runtime). - Builds
apps/docs/(vitepress build) intoapps/docs/.vitepress/dist/. - Builds
apps/landing/and overlays itsdist/onto the VitePress dist root. - Builds
apps/editor/withVITE_BASE=/wiremd/editor/and copies it intoapps/docs/.vitepress/dist/editor/. - Uploads the merged tree to the GitHub Pages environment.
The result: teezeit.github.io/wiremd/ serves the landing page at the root, the docs from VitePress, and the live editor at /editor/ β all from a single Pages deployment.
Standalone CLI bundle β
scripts/build-bundle.mjs produces a single-file CommonJS CLI from packages/core/src/cli/index.ts using esbuild and writes it to:
releases/wiremd.jsβ uploaded to the rollinglatestGitHub prerelease and to tagged releasesextensions/skills/wireframe/bin/wiremd.jsβ committed back to the repo so the Claude plugin ships with a self-contained CLI (nonpm installrequired for plugin users)
The same script also runs pnpm package inside extensions/vscode/ and copies the resulting .vsix to releases/wiremd.vsix. build-bundle.yml runs this on every relevant push to main.
Verifying a release β
After tag push:
- Watch the Actions tab for
release.ymlandpublish.yml. - Check the release page: https://github.com/teezeit/wiremd/releases β the new tag should have auto-generated notes,
wireframe-skill.zip, and (for non-extension-only releases)wiremd.vsix+wiremd.js. - Confirm the new VS Code extension version on the Marketplace.
- Confirm npm published the new package:
npm view wiremd version.
Manual emergency publish β
If CI is broken and a release must ship:
# Tests + build
pnpm install
pnpm turbo run test
pnpm turbo run build
# npm
pnpm --filter @eclectic-ai/wiremd run build
cd packages/core && npm publish --access public
# VS Code Marketplace (requires VSCE_PAT exported in your shell)
pnpm --filter wiremd-preview run bundle
pnpm --filter wiremd-preview run publish
# Skill zip + CLI bundle
pnpm run skill:zip # β wireframe-skill.zip
pnpm run bundle # β releases/wiremd.{js,vsix}
gh release upload v<X.Y.Z> wireframe-skill.zip releases/wiremd.js releases/wiremd.vsixTroubleshooting β
Publish workflow fails β
- Check the action logs.
- Common causes: tests failing,
VSCE_PATexpired (rotate at the Marketplace publishers page), version already published.
Wrong version published β
You cannot unpublish npm versions younger than 72 hours. Publish a new patch with the fix instead.
sync-versions.mjs didn't update files β
The hook only fires when you run npm version inside packages/core/. If you bumped manually, run it explicitly: pnpm run sync-versions (from the repo root).
Security β
- Never commit
VSCE_PAT,NPM_TOKEN, or any other credentials to the repository. - Use GitHub repository secrets for all CI tokens.
- Use Automation tokens (npm) and Personal Access Tokens (vsce) β both can be revoked independently of human accounts.
- Rotate tokens at least annually, and immediately if a contributor with access leaves the project.
- Enable 2FA on the npm and Microsoft (Marketplace publisher) accounts.