Mobile companions: adb, expo and eas, installed on request - #62
Merged
Conversation
`adb` forces a fourth kind of companion install. It is not on npm -- what is published under those names is either a Node reimplementation of the wire protocol or somebody's mirror of Google's zip, and a debugging bridge that gets a root shell on every attached device is the last thing to take from a mirror. Google publishes no installer either, only platform-tools-latest-<os>.zip. So `archive` joins npm, script and go: scripts/install-archive.ts fetches it, unpacks it under vendor/platform-tools and links `adb` and `fastboot`, which is the arrangement install.sh already has with the Stripe CLI moved somewhere `cli-tools update` can reach. An adb already on PATH is left alone rather than shadowed, a real file in the prefix is never overwritten, and the unpacked tree is swapped in at the end so a failed download leaves a working install alone. There is no checksum to check -- Google publishes none beside that alias -- so the sha256 of what landed is printed instead of the silence. `expo` and `eas` are why companions now have groups. Between them they are about half a gigabyte, and a web server has no use for either, so installing them because somebody ran the installer is exactly the surprise `diskpush --cli-only` exists to avoid. Grouped companions are installed when asked for -- `cli-tools companions --install mobile`, or a name, or `all` -- and `update` follows the same rule: it updates the mobile commands a box has and never adopts the ones it does not. `link` and install.sh name the group once rather than nagging. Verified end to end: the archive install lands adb 1.0.41 and fastboot from platform-tools 37.0.1, is idempotent on a second run, and steps aside for a foreign adb on PATH; expo 57.0.22 and eas-cli 23.2.0 both give working global binaries. The npm-companion test insisting on a scoped package is relaxed -- that held only while every one was ours or Bitwarden's. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RsvBXsJ6X3KU6bfC5H4m9J
ThreatCrush Security Scan12 finding(s) HIGH/CRITICAL: 4 | MEDIUM: 4 | LOW: 4
Snippets are redacted; ThreatCrush never prints matched credential material. |
Merged
ralyodio
added a commit
that referenced
this pull request
Sep 9, 2026
Four changes since v0.29.0, three of which have been sitting on master unreleased: - argontv: the shared line, and whether there is room to sell (#61) - mobile companions: adb, expo and eas, installed on request (#62) - telnyx, because a number bought by clicking is not reproducible (#63) - agenticjobs: the job board, as a command on every box (#64) Claude-Session: https://claude.ai/code/session_01WxWrsbLuaSaZqQ7FFTrdVW Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds
adb(withfastboot),expoandeasto the companion set, and the two bits of machinery they needed.A fourth install kind:
archiveadbis not on npm. What is published under those names is either a Node reimplementation of the wire protocol (adbkit) or somebody's mirror of Google's zip, and a debugging bridge that gets a root shell on every attached device is the last thing to take from a mirror. Google publishes no installer either, onlyplatform-tools-latest-<os>.zip.So
archivejoinsnpm,scriptandgo.scripts/install-archive.tsfetches the zip, unpacks it undervendor/platform-toolsand linksadbandfastboot— the arrangementinstall.shalready has with the Stripe CLI, moved somewherecli-tools updatecan reach. The careful parts:adbalready on PATH (apt's, or an Android Studio SDK's) is left alone;--forceinstalls anyway and names what it is now competing with rather than claiming a takeover--forceor notvendor/(a rename does not cross filesystems, and /tmp is a tmpfs here), and the tree is swapped in last, so a failed download leaves a working install where it wasGroups, because Expo is 500MB
expo(343MB) andeas-cli(165MB) on every box that runscurl | shis exactly the surprisediskpush --cli-onlyexists to avoid. Companions can now name a group, and a grouped one is installed only when asked for:updatefollows the same rule — it updates the mobile commands a box has and never adopts the ones it does not.linkandinstall.shname the group once rather than nagging.Verified
adbon PATH, and reports the shadowing under--forceexpo --version→ 57.0.22 andeas --version→ 23.2.0 from a throwaway global prefixtscerrors insrc/argontv.tsandsrc/free-names.tsare pre-existing and untouchedThe npm-companion test insisting on a scoped package is relaxed: that held only while every npm companion was ours or Bitwarden's.
Deliberately not included, and documented as such in the README:
scrcpy(a distro package), the Androidcmdline-toolsthat carrysdkmanagerand the emulator (JDK plus a licence-acceptance flow — Android Studio's job), and Maestro (a bash installer that appends to your shell rc files and needs Java).🤖 Generated with Claude Code
https://claude.ai/code/session_01RsvBXsJ6X3KU6bfC5H4m9J