Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .agents/skills/test-t3-mobile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ Keep local verification focused. Do not turn this workflow into a full repositor
- **The environment remains empty:** verify the platform-specific HTTP origin, use a fresh token, and confirm project seeding used the identical base directory.
- **A second client cannot pair:** pairing tokens are single-use; issue another token.
- **The pairing form opens but does not connect:** confirm the deep link uses the existing `connections/new` route, includes `autoConnect=1`, and carries a freshly minted encoded `pairingUrl`.
- **Pairing text changes case or punctuation:** do not retry semantic typing. Use `scripts/pair-client.sh`; the simulator keyboard layout and HID input path are not reliable for credentials.
- **Pairing text changes case or punctuation:** do not retry semantic typing. Use `.agents/skills/test-t3-mobile/scripts/pair-client.sh`; the simulator keyboard layout and HID input path are not reliable for credentials.
- **iOS semantic actions fail:** set explicit XcodeBuildMCP defaults and refresh with `snapshot_ui`.
- **Android cannot reach Metro:** verify `adb reverse` for the exact Metro port and relaunch the development-client URL.
- **Android cannot reach the backend:** use `10.0.2.2`, not `127.0.0.1`, for the Android Emulator.
2 changes: 1 addition & 1 deletion apps/web/src/terminal/ghostty/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ It is intentionally not an xterm compatibility layer.
- `vendor/` holds only the artifacts, reproducibly generated by
`apps/web/scripts/build-libghostty-wasm.sh`. The upstream pin and license live once, at
`native/libghostty-vt/` at the repository root; the wasm embeds the pinned revision
in its build info and the ABI test verifies it against mobile's `VERSION`.
in its build info and the ABI test verifies it against that `VERSION` file.

Keep browser behavior here and terminal transport in the existing client runtime. Do not add React
state to the render loop. Both WASM artifacts are ordinary read-only assets, not executables.
2 changes: 2 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

- [Install and first run](./user/install.md)
- [Permission modes](./user/permission-modes.md)
- [Message composer](./user/composer.md)
- [Keyboard shortcuts](./user/keybindings.md)
- [Organizing threads](./user/thread-sidebar.md)
- [Review usage](./user/usage.md)
Expand All @@ -30,6 +31,7 @@ policy in [CONTRIBUTING.md](../CONTRIBUTING.md); agent rules in [AGENTS.md](../A
- [Scripts](./internals/scripts.md)
- [Connection runtime](./internals/connection-runtime.md)
- [Providers](./internals/providers.md)
- [Terminal renderers](./architecture/terminal-renderers.md)
- [Remote environments](./internals/remote.md)
- [Server updates](./internals/server-updates.md)
- [Resource telemetry](./internals/resource-telemetry.md)
Expand Down
15 changes: 9 additions & 6 deletions docs/architecture/terminal-renderers.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Terminal renderers

> For maintainers. Using T3 Code? See [docs/user](../user/).

Terminal sessions remain server-owned PTYs. Clients receive the existing raw byte stream and send
input and resize events over the existing terminal contracts; renderer choices never cross the
wire.
Expand Down Expand Up @@ -28,15 +30,16 @@ detaches the PTY callback so historical device queries cannot emit replies into

## Updating Ghostty

Update and rebuild Android first, because mobile's `VERSION` file is the single source of truth for
the upstream pin (the upstream `LICENSE` lives beside it). Then run:
Update `native/libghostty-vt/VERSION` and rebuild Android first, because that file is the single
source of truth for the upstream pin shared by Android and web (the upstream `LICENSE` lives beside
it). Then run:

```sh
pnpm --dir apps/web build:ghostty-wasm
vp run --filter @t3tools/web build:ghostty-wasm
```

Commit the regenerated web `wasm` artifacts. The build embeds the pinned revision into the binary as
semver build metadata, and the focused web ABI test reads it back through `ghostty_build_info` and
compares it against mobile's `VERSION` — so the web vendor directory holds only the artifacts, drift
cannot hide, and there is no second pin to keep in sync. The same test enforces the artifact budget
and exercises repeated create/write/free cycles with multi-codepoint graphemes.
compares it against `native/libghostty-vt/VERSION` — so the web vendor directory holds only the
artifacts, drift cannot hide, and there is no second pin to keep in sync. The same test enforces the
artifact budget and exercises repeated create/write/free cycles with multi-codepoint graphemes.
4 changes: 2 additions & 2 deletions docs/internals/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ subscription.

[`ws.ts`][ws] serves the group. `websocketRpcRouteLayer` mounts `GET /ws`, authenticates the upgrade
through `EnvironmentAuth.authenticateWebSocketUpgrade`, then hands the socket to
`RpcServer.toHttpEffectWebsocket`. Authorization is per method: `RPC_REQUIRED_SCOPE` maps each method
to a scope, and `authorizeEffect`/`authorizeStream` enforce it. Holding a valid socket is not
`RpcServer.toHttpEffectWebsocket`. Authorization is per method: `RPC_REQUIRED_SCOPES` maps each
method to a scope, and `authorizeEffect`/`authorizeStream` enforce it. Holding a valid socket is not
authorization to call everything on it. See [environment-auth.md](./environment-auth.md).

On the client, [`session.ts`][session] opens the socket and builds the typed client.
Expand Down
2 changes: 1 addition & 1 deletion docs/internals/t3-connect.md
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ installed app executable with `VITE_DEV_SERVER_URL` and `T3CODE_PORT` set. Rebui
after native dependency, main-process, preload, entitlement, provisioning, or signing changes;
renderer-only changes can reuse the installed app.

For the default development ports, run `pnpm dev:web` in one terminal and launch the installed
For the default development ports, run `vp run dev:web` in one terminal and launch the installed
binary from another:

```sh
Expand Down
38 changes: 19 additions & 19 deletions docs/operations/mobile-app-store-screenshots.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Environments screen. The local environment cards always come from real paired se

From the repository root:

pnpm screenshots:mobile
vp run screenshots:mobile

The command:

Expand All @@ -44,15 +44,15 @@ active. Both platforms record readiness in the simulator/emulator app container.
delay allows native terminal and Git review data to finish rendering.

A full capture regenerates the selected native project with Expo's clean production prebuild before
building it. Use --skip-build for repeated captures after the first build.
building it. Use `--skip-build` for repeated captures after the first build.

The harness uses fixed Metro port `8199`, which separates it from Expo's normal default port but is
shared across every checkout. The readiness check only verifies that the port is open; it does not
verify process ownership. Concurrent screenshot harnesses in different worktrees can therefore
collide or attach to the wrong Metro process.

Every configured device defaults to dark appearance and the `t3-code` palette, so plain
`pnpm screenshots:mobile` produces 30 dark PNGs. Pass `--appearance light`, `--appearance dark`, or
`vp run screenshots:mobile` produces 30 dark PNGs. Pass `--appearance light`, `--appearance dark`, or
`--appearance both` to override the configured appearance; `both` produces 60 PNGs.

Pass `--theme <id>` (repeatable) or `--theme all` to capture the app's other palettes: `t3-code`,
Expand Down Expand Up @@ -122,46 +122,46 @@ debug APK matches its accelerated emulator.

Capture one scene or device:

pnpm screenshots:mobile --device iphone-6.9 --scene thread
pnpm screenshots:mobile --platform android --scene review
vp run screenshots:mobile --device iphone-6.9 --scene thread
vp run screenshots:mobile --platform android --scene review

Override the configured appearance or capture both variants:

pnpm screenshots:mobile --appearance light
pnpm screenshots:mobile --appearance dark
pnpm screenshots:mobile --appearance both
vp run screenshots:mobile --appearance light
vp run screenshots:mobile --appearance dark
vp run screenshots:mobile --appearance both

Capture other palettes:

pnpm screenshots:mobile --device iphone-6.9 --theme ocean
pnpm screenshots:mobile --device iphone-6.9 --theme ocean --theme ember
pnpm screenshots:mobile --device iphone-6.9 --theme all
vp run screenshots:mobile --device iphone-6.9 --theme ocean
vp run screenshots:mobile --device iphone-6.9 --theme ocean --theme ember
vp run screenshots:mobile --device iphone-6.9 --theme all

Reuse the native build and retain the disposable environment:

pnpm screenshots:mobile --device ipad-13 --skip-build --keep-running
vp run screenshots:mobile --device ipad-13 --skip-build --keep-running

By default, let the screenshot runner start Metro on port `8199`. To keep Metro in a separate
terminal, start it with the same showcase environment and explicit harness port:

cd apps/mobile
APP_VARIANT=development EXPO_PUBLIC_SHOWCASE=1 pnpm exec expo start --dev-client --port 8199
APP_VARIANT=development EXPO_PUBLIC_SHOWCASE=1 vp exec expo start --dev-client --port 8199

Then run the capture from the repository root:

pnpm screenshots:mobile --skip-build --skip-metro --device iphone-6.9
vp run screenshots:mobile --skip-build --skip-metro --device iphone-6.9

`pnpm --filter @t3tools/mobile showcase` starts Expo on its normal port, so it is not compatible with
the harness's `--skip-metro` mode.
`vp run --filter @t3tools/mobile showcase` starts Expo on its normal port, so it is not compatible
with the harness's `--skip-metro` mode.

List the matrix and flags:

pnpm screenshots:mobile --list
vp run screenshots:mobile --list

Validate existing files without starting Metro, servers, simulators, or emulators:

pnpm screenshots:mobile --validate-only
pnpm screenshots:mobile --platform ios --validate-only
vp run screenshots:mobile --validate-only
vp run screenshots:mobile --platform ios --validate-only

## Customize the seeded environment

Expand Down
5 changes: 3 additions & 2 deletions docs/user/updating.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,9 @@ commands.
## After the Update

Keep the web or desktop app open while the server restarts. The update completes only after the
service launcher reports that exact update committed and the replacement server is ready to accept
commands. A rollback is reported immediately instead of waiting for a generic reconnect timeout.
service launcher reports that exact update as committed and the replacement server is ready to
accept commands. A rollback is reported immediately instead of waiting for a generic reconnect
timeout.

If a step fails:

Expand Down
Loading