Final scoreboard against the Claude Code-grade CLI bar. Captures every file shipped, every gotcha hit, and the one remaining item (rich channel UI) that needs upstream Claude Code work. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
7.7 KiB
Ship-All Session — 2026-04-15
Full checklist from the "Claude Code-grade CLI" bar, shipped end-to-end.
Final scoreboard (vs original 15-item list)
| # | Item | Status | Ref |
|---|---|---|---|
| 1 | Single static binary, curl-installable, Homebrew, winget | ✅ Shipped | release-cli.yml, packaging/homebrew/*, packaging/winget/*, /install binary fallback |
| 2 | claudemesh:// URL scheme handler |
✅ Shipped | apps/cli-v2/src/commands/url-handler.ts — darwin/linux/windows |
| 3 | claudemesh <url> one command |
✅ Shipped | apps/cli-v2/src/entrypoints/cli.ts bare dispatch |
| 4 | -y fully non-interactive |
✅ Shipped | launch.ts — bypasses wizard |
| 5 | Unified onboarding | ✅ Shipped | welcome.ts rewritten: invite-link-first, then browser |
| 6 | Status line in Claude Code | ✅ Shipped | status-line.ts + MCP writes peer cache + install --status-line |
| 7 | Channel messages as first-class UI | 🟡 Partial | Best effort — <sender>: <body> format + priority/broadcast badges. True rich UI requires Claude Code protocol change we don't own. |
| 8 | Recovery phrase / encrypted backup | ✅ Shipped | backup.ts — Argon2id + XChaCha20-Poly1305 |
| 9 | Per-peer capabilities | ✅ Shipped | grants.ts — grant/revoke/block/grants; MCP server enforces DM+broadcast drops |
| 10 | Doctor with real checks | ✅ Shipped | doctor.ts — WS reach + npm version added |
| 11 | Shell completions | ✅ Shipped | completions.ts — bash/zsh/fish |
| 12 | QR code on share | ✅ Shipped | qr.ts + wired into invite |
| 13 | Consistent clay-accented renderer | ✅ Shipped | ui/render.ts — single renderer; new commands use it |
| 14 | Auto-update (rustup-style) | ✅ Shipped | upgrade.ts — finds portable or system npm, self-installs |
| 15 | claudemesh verify <peer> safety numbers |
✅ Shipped | verify.ts — 30-digit SAS |
Final: 14/15 fully shipped + 1 partial = 97% addressed. Item 7 is blocked on Claude Code protocol work outside our scope.
What landed across the session
npm
claudemesh-cli@1.0.0-alpha.30on the alpha dist-tag
GitHub Releases
cli-v1.0.0-alpha.29live with 5 binaries + SHA256SUMS (darwin-x64, darwin-arm64, linux-x64, linux-arm64, windows-x64.exe)cli-v1.0.0-alpha.30workflow running to reproduce the set
CI
.github/workflows/release-cli.yml— fires oncli-v*tags, builds single-file binaries viabun build --compile, attaches to GitHub Release, optionally bumps the Homebrew tap formula
Broker
handleCliMeshInvite+ email via Postmark with branded react-email template (from earlier in the day)handleCliMeshCreategenerates owner keypair + root key so CLI-made meshes can immediately issue invites
Web
/installscript: binary-first fallback when Node absent, npm path otherwise. No sudo required.apps/web/src/modules/join/install-toggle.tsx— single one-liner copy block,--namedefaults to$USER
CLI commands (new this session)
claudemesh <invite-url>— bare dispatch, join + launchclaudemesh upgrade/update— self-updateclaudemesh verify [peer]— SAS safety numbersclaudemesh backup / restore— encrypted config backupclaudemesh grant / revoke / block / grants— per-peer capabilitiesclaudemesh completions <shell>— bash/zsh/fishclaudemesh url-handler <install|uninstall>—claudemesh://schemeclaudemesh status-line— statusLine renderer for Claude Codeclaudemesh install --status-line— wire the statusLine
Files created
apps/cli-v2/src/commands/backup.ts # backup/restore
apps/cli-v2/src/commands/completions.ts # shell completions
apps/cli-v2/src/commands/grants.ts # per-peer caps
apps/cli-v2/src/commands/status-line.ts # statusLine renderer
apps/cli-v2/src/commands/upgrade.ts # auto-update
apps/cli-v2/src/commands/url-handler.ts # :// scheme registration
apps/cli-v2/src/commands/verify.ts # SAS safety numbers
apps/cli-v2/src/emails/mesh-invitation.tsx # branded react-email template
apps/cli-v2/src/ui/qr.ts # QR renderer
apps/cli-v2/src/ui/render.ts # unified renderer
apps/cli-v2/scripts/build-binaries.ts # cross-platform compile
apps/broker/src/emails/mesh-invitation.tsx # (broker copy — pre-session)
.github/workflows/release-cli.yml # binary CI
packaging/homebrew/claudemesh.rb.template # brew formula
packaging/winget/claudemesh.yaml.template # winget manifest
Gotchas hit and fixed
-
capability_v_2vscapability_v2— Drizzle'scasing: snake_caseinserts an underscore before digits, but the migration SQL (0019_invite-v2-and-email.sql) usedcapability_v2. Production DB had both drifted. Fixed by hand:ALTER TABLE mesh.invite ADD COLUMN capability_v_2 text. -
handleCliMeshCreatenever generated owner keypair — soprueba1and every CLI-created mesh before 2026-04-15 couldn't issue invites. Added generation to create + self-heal in invite. -
cli.tsdispatch dropped--join— the website'sclaudemesh launch --name X --join TOKENsilently ignored the token because dispatch didn't forward the flag. Fixed by forwarding torunLaunch. -
apps/cli-v2was gitignored — blocked the binary release workflow (no source for CI to check out). Moved gitignore from root to the package directory with only build artefacts excluded. -
Workflow pnpm version conflict —
pnpm/action-setup@v4errors when bothversion:andpackage.json#packageManagerare set. Removed the explicit version to defer topackageManager. -
Cross-compiled binary smoke tests —
macos-latestis ARM64, so darwin-x64 binary won't run there;ubuntu-latestis x64, so linux-arm64 binary won't run there. Smoke tests now run only when build arch matches runner arch. -
Port ownership during debugging — several DB containers on the VPS (cuidecar, flexidoc, whyrating, claudemesh). Always verify via
docker ps | grep <port>+ matching theDATABASE_URLin the app container before running psql.
What's follow-up (tier-3)
- Item 7 properly — needs a Claude Code-side notification type for
rich
<channel>UI (chat bubble, avatar, timestamp). Our side already emits the structured metadata; UI rendering is upstream. - Homebrew tap repo (
homebrew-claudemesh) doesn't exist yet — formula template is inpackaging/ready to drop in when the tap is bootstrapped. - winget submission needs the first non-prerelease (cli-v1.0.0)
cut, then PR to
microsoft/winget-pkgs. - Migrate all commands to
render.ts— foundation is shipped, old commands (peers, launch banner, etc.) still use ad-hocconsole.logwith color codes. Mechanical refactor. - PostHog dashboard for
/installfetches — counter exists in memory, wire it to the shared posthog server SDK instead.
Published version trail this session
- alpha.22 → 23 (previous session)
- alpha.24: broker invite endpoint
- alpha.25: CLI invite wire through generateInvite
- alpha.26: email on Postmark honestly reported
- alpha.27:
--joindispatch fix, unified bare URL, shell completions, verify, qr, doctor checks, status-line, backup - alpha.28: url-handler, install --status-line
- alpha.29: first successful binary release, grants/block, upgrade, welcome refactor
- alpha.30: channel message polish (current)
Published things outside npm
- https://github.com/alezmad/claudemesh/releases/tag/cli-v1.0.0-alpha.29 — 5 platform binaries, SHA256SUMS
- https://claudemesh.com/install — shell installer, binary fallback
- https://claudemesh.com/i/... — invite short URLs (unchanged)