How a release actually ships and what to verify post-publish. Process exists because dario#143 — a regression that broke every npm-global install for four releases in a row — slipped through npm test, CI, and the dev loop, all of which exercise the dev tree (node dist/cli.js …) but never the installed bin shim.
Dario uses inline auto-release: bumping package.json.version on master fires .github/workflows/cc-drift-auto-release.yml (display name "Auto release on version bump"), which tags vX.Y.Z, generates a GitHub Release from the matching ## [X.Y.Z] CHANGELOG section, and runs npm publish --access public --provenance + the inline GHCR docker push in the same job.
No manual git tag / npm publish step. The version bump on master is the release.
The flow chosen because GITHUB_TOKEN-created releases don't fire release:published, so a separate workflow listening for that event would never trigger — the standalone publish.yml/docker-publish.yml that did were removed in #369 and folded inline. Cost: lost the v0.3.0-equivalent of deepdive#3.0 once via that mistake; not making it twice. A manual gh release create will NOT publish — only the version-bump path does.
-
npm run build— clean -
npm test— all green (77 test files viatest/all.test.mjs) -
package.json.versionbumped if and only if the PR is a release -
CHANGELOG.mdhas a matching## [X.Y.Z] - YYYY-MM-DDheading above## [Unreleased], populated with the release's user-visible changes - No
Co-Authored-By:trailers in commits -
package-lock.jsonre-synced (npm install --package-lock-only) - PR description names what's user-visible — copy the CHANGELOG heading body in if non-trivial
Most failures get caught by npm test. Bin-shim invocation does not — the dev tree, the test runner, and CI's --help smoke all run node dist/cli.js directly, never through the symlink an end user actually invokes.
Within ~10 minutes of npm publish completing (auto-release prints the publish line in the workflow output):
# 1. Install the just-published version globally.
npm install -g @askalf/dario@latest
# (or @<exact version> if you want to pin past a fast-follow.)
# 2. Confirm the bin-shim is reachable and the version matches.
which dario
dario --version
# 3. THE FAILURE THAT dario#143 SHIPPED — silent CLI on the installed binary.
# These all should produce normal output. If any prints nothing and
# exits 0, the main-entry guard is broken (or whatever new way the CLI
# is gating itself out). Roll back immediately.
dario --help
dario doctor
dario doctor --usage # also exercises the per-model probe path
# 4. Confirm the proxy starts and serves /health from the installed binary.
DARIO_NO_BUN=1 dario proxy &
sleep 2
curl -s http://127.0.0.1:3456/health
kill %1If anything is silent, ships an Unknown command: error from commands[command] lookup, or fails to bind: stop, file an issue, ship a fix as the next patch release. Do not assume the next user will report it — dario has multi-day windows where a regression like this can sit on npm with hundreds of pulls before a single user types out a bug report (#143's silent-CLI was on npm for ~12 hours and exposed in dependency-free dario doctor runs across four releases before the report arrived).
When a release ships broken (the dario#143 case): branch from master, fix, version-bump to next patch, re-run the post-publish smoke above against the new version. Don't try to npm unpublish an already-released version — npm allows it for 72 hours but downstream caches and lockfiles are unpredictable; the fix-and-fast-follow pattern is more honest. Mention the broken version range in the new release's CHANGELOG with an explicit "anyone on vX.Y.Z–vA.B.C should upgrade" line.
- CodeQL / actionlint required-status-check path filters. Removed across dario / claude-bridge / deepdive / hands. A path-filtered required check sits as permanently-pending on PRs that don't touch the path, which blocks merges silently. Already fixed; mentioned here so a future contributor doesn't re-add a path filter.
- Co-Authored-By trailers. User's git log is single-author. Don't add the
Co-Authored-By: Claude …block to commit messages. - Skipped pre-commit hooks.
--no-verifyand--no-gpg-signflags are not used. If a hook fails, fix the underlying issue.
| Setting | State | Why |
|---|---|---|
delete_branch_on_merge |
on | Auto-clean merged head branches; no stale-branch litter |
| Required status checks | build (18/20/22), validate-package-json, analyze, actionlint |
All four green before merge; no path filters |
| Auto-merge | on | PRs auto-merge once required checks clear |
Branch protection on master |
on | Prevent force-push, require PR review |
NPM_TOKEN secret |
set | auto-release uses it for npm publish --provenance |
| Secret scanning + push protection | on | Catches token leaks pre-push |
| Dependabot security updates | on | Free on public repos |
The dario#143 silent-CLI regression that motivated the post-publish smoke step: