Skip to content

How a crewrota release is put together

A crewrota release carries one version number in two files: package.json for the npm package and plugin/.claude-plugin/plugin.json for the Claude Code plugin. A test fails when the two differ. The npm package ships the built CLI, the templates and the widget; the plugin is installed from the GitHub repo.

File Field At 1.0.4
package.json version 1.0.4
plugin/.claude-plugin/plugin.json version 1.0.4

src/test/plugin.test.ts reads both and fails when they are not equal, so npm test catches a release that bumps only one. crew --version prints the version from package.json, and a backup’s manifest.json records it.

From files in package.json:

Path What it is
dist/ without dist/test/ The built CLI
templates/ What crew init writes
widget/ The quota widget and the SwiftBar and xbar plugin
NOTICE Notices

npm adds package.json, README.md and LICENSE on its own. prepack runs npm run build, so npm pack and npm publish always pack a fresh dist/. The bin names crewrota, crw and crew all point at dist/cli.js; engines asks for Node 22.19 or newer.

Check what would ship before a release:

Terminal window
npm pack --dry-run

The repo is a Claude Code plugin marketplace: .claude-plugin/marketplace.json lists one plugin, crewrota, from ./plugin. Users install it from GitHub, so a plugin change reaches them from the repo, not from npm:

Terminal window
claude plugin marketplace add pasindu-premachandra/crewrota
claude plugin install crewrota@crewrota
  • npm run typecheck and npm test, which include the version check above.
  • CI on Windows, macOS and Ubuntu for every push to main and every pull request.
  • npm run check:private, which should print clean.
  • npm pack --dry-run, for the file list.

The repo has no CHANGELOG file and no release checklist.