Files
LakrandClaude Opus 5.5 37745690a8 Let Launchpad update a stopped machine's guest environment
A machine's restore tree is removed after its first boot, so cfw install
cannot run again and a machine made by an older bundle never gets newer
hook dylibs. The helper gains updateGuestEnvironment, which runs the
bundle's `vphone-cli cfw update-environment` as root through the same
checks, output channel, lock and cancel as the install. Launchpad offers
Update Guest Environment in a stopped, installed machine's menu, and
vphone-launchpad-cli gains `cfw update-environment <name>`.

The helper protocol changed, so CURRENT_PROJECT_VERSION goes to 9 and
Launchpad reinstalls the helper. The CLI verb itself lands with the
installer's resource-only mode.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 18:54:58 +09:00

72 lines
3.7 KiB
Markdown

# Launchpad command line
`vphone-launchpad-cli` ships in `vphone-launchpad.app/Contents/MacOS`. It
drives the running Launchpad over a Unix socket at
`~/Library/Application Support/vphone-launchpad/control.sock` (mode 0600,
served only to the same user) and starts Launchpad in the background when it
is not running. It has no privileges and no state of its own: bundles are
installed through Launchpad's helper, machines run through the active
bundle's `vphone-cli`, and every command appears in Launchpad's window and
command history. Nothing listens on the network; reach it over ssh from
another machine.
Progress lines go to stderr as they arrive. The result is one JSON document on
stdout. The exit status is 0 on success and 1 on failure, with the reason on
stderr. Interrupting the CLI cancels a command that can be cancelled
(`exec`, waits, CFW install); a bundle install or machine creation belongs to
the window and keeps running.
```sh
ln -s /Applications/vphone-launchpad.app/Contents/MacOS/vphone-launchpad-cli /usr/local/bin/
vphone-launchpad-cli help
```
## Testing a VPhone.bundle build
```sh
xcodebuild -workspace VPhone.xcworkspace -scheme VPhone \
-configuration Debug -destination 'platform=macOS,arch=arm64' \
-derivedDataPath .build/XcodeBundle build
# Installs as <version>-local, makes it active, adds the execution policy
# exception, allows the new vphone-vm cdhash and runs host preflight.
vphone-launchpad-cli bundle install-local .build/XcodeBundle/Build/Products/Debug/VPhone.bundle
vphone-launchpad-cli vm start research-01 --wait
vphone-launchpad-cli guest rpc research-01 device.info
vphone-launchpad-cli guest rpc research-01 apps.list '{}'
vphone-launchpad-cli vm log research-01 --lines 100
vphone-launchpad-cli vm stop research-01
# The same checks against the release it replaces.
vphone-launchpad-cli bundle use 2.1.2
```
The first step that needs the helper after its five-minute authorization
expires asks for an administrator password on the Mac, as the window does.
## Commands
| Command | Does |
| --- | --- |
| `status` | Host checks, helper, active bundle, machine counts |
| `bundle list` | Installed versions, receipts, cdhashes and check results |
| `bundle install-local <path>` | Install a local `VPhone.bundle` folder or `.zip` |
| `bundle install-release <version\|latest>` | Download and install a GitHub release |
| `bundle use <version>` / `bundle verify <version>` | Switch to or re-check an installed version |
| `bundle accept <version> [--off]` / `bundle remove <version>` | Skip failed checks, or remove a version |
| `vm list` | Machines in every library with run state and log path |
| `vm start <name> [--headless] [--wait]` / `vm stop <name>` | Launch or stop; `--wait` waits for vphoned |
| `vm wait <name>` / `vm log <name> [--kind create\|dfu\|patch]` | Wait for vphoned; read a console log |
| `vm create <name> [...] [--from <step>]` | The New Machine pipeline; `--from` retries from a step |
| `cfw install <name>` | Install CFW into a stopped machine through the helper |
| `cfw update-environment <name>` | Redeploy the active bundle's guest resources (vphoned, hook dylibs) into a stopped machine through the helper; nothing else changes |
| `guest send <name> <json>` | One raw `vphone.sock` request (tap, swipe, key, screenshot) |
| `guest rpc <name> <method> [params]` | Any vphoned method, see `Research/vphoned_http_api.md` |
| `exec <vphone-cli arguments>` | Run the active bundle's `vphone-cli`, streaming its output |
Machine commands take `--root <library>` when two libraries hold a machine
with the same name. `guest` commands and `--wait` go through the machine's
`vphone.sock`, which every launch serves; bundles up to 2.0.9 serve it only
for machines launched with a window.