Patch release. No runtime behavior changes — src/cli/doctor.ts is a maintainer command; everything else is build tooling, tests, and docs.
Fixed
The test suite ran nested copies of itself (#139)
tests/setup.test.ts spawns the doctor CLI, and doctor --pre-release's "Test suite" check spawned a full vitest run, which re-ran that file, which spawned doctor again — unbounded, with no guard. 40+ orphaned vitest processes per run, outliving the run that started them.
doctor now skips that check when process.env.VITEST is set.
The effect is much larger than a leak fix:
| tests | wall | |
|---|---|---|
| local, before | 717 | 397s |
| local, after | 718 | 24s |
| CI, before | — | 481–531s |
| CI, after | — | 53s |
The suite was spending roughly 93% of its wall time running copies of itself. It also explains a class of phantom failures: one run reported 2 failures in 771s, both 5-second timeout expirations under CPU starvation, which vanished on the identical commit once the orphans were killed.
The .mcpb build was a race (#121)
mcpb pack ignores the output path it is handed and writes himalaya-mcp-<version>.mcpb — no v prefix — into either the project root or the packed directory. build-mcpb.sh papered over this with a sleep-and-retry rename that globbed only the project root, and that loop raced: it won on the v2.1.0 release and lost on v2.1.1, failing the build and skipping the entire Homebrew formula update. Re-running the identical commit succeeded, which is what proved it nondeterministic rather than broken.
The retry is gone — once pack exits there is nothing to wait for, only a name to reconcile. Both candidate directories are searched, the stale-output cleanup covers both, and the rename refuses any archive whose filename does not carry the current version.
Documentation
A staleness review before this release corrected several things that were quietly wrong:
CLAUDE.mdandAGENTS.mdtold agents the full suite is a "~6-minute run". That figure was measuring #139, not the tests. Both now carry the real timings and explain why the old number existed.- Eleven surfaces still claimed 717 tests; the #139 regression test made it 718.
setup.test.tswas documented as 49 tests; it has 52. That drift predated this release.
Verification
vitest run --maxWorkers=1
Test Files 41 passed (41)
Tests 718 passed (718)
Duration 23.91s exit 0, 0 orphaned processes
npm audit --audit-level=high found 0 vulnerabilities
build / build:bundle clean
build:mcpb himalaya-mcp-v2.1.2.mcpb, 253 KB, manifest 2.1.2
mkdocs build --strict clean
main CI green on cc6b9a7
docs site verified live at 2.1.2
The .mcpb attached below was built from a tree hash-identical to the v2.1.2 tag.
Install
brew upgrade himalaya-mcp # Homebrew
claude plugin install himalaya # Claude CodeFor Claude Desktop, download himalaya-mcp-v2.1.2.mcpb below and double-click it.
Full changelog: v2.1.1...v2.1.2