Skip to content

プレビュー配信 (uzu preview) ​

uzu preview はビルドしたゲームを 1 本アップロードし、emulator でそのまま触れるリンクを返します。 シナリオのリビジョンは登録しないので、公開中のゲームには一切影響しません。

PR のレビューで「差分を読んでも見た目と操作が分からない」を解消するための機能です。 リンクを PR に貼れば、開いた人が手元にチェックアウトして uzu dev を立てなくても触れます。

使い方 ​

manifest.json のあるディレクトリで実行します。

bash
npx uzu preview
Previewing game: silk-and-chrome (players: 5, orientation: landscape)
Building server logic...
Building...
Creating ZIP...
Uploading to R2...
Uploaded to R2. revisionId: pv-01m31sg6rpxcb00jksfx009ezp
Uploading logic.js to R2...

Done!
Preview: https://emulator.code.uzu-app.com/?endpoint=...&revision_id=pv-...&player_count=5&orientation=landscape&admin=1&server_url=...
このリンクは 14 日ほどで開けなくなります (R2 から実体が削除されるため)

リンクは manifest.json の playerCount / orientation / admin を反映した状態で開きます。 characters を宣言していれば人数はその長さです。つまり uzu dev のハーネスと同じ席割りを、 インストール不要で他人に渡せます。

オプション ​

オプション内容
--json{ "id", "url", "expiresAt" } を stdout へ出す。進捗は stderr へ回る
--label <text>アップロードの監査ログに残す表示名 (PR 番号など)。200 バイト以内・改行なし
bash
npx uzu preview --json --label "PR #453"
json
{
  "id": "pv-01m31sg6rpxcb00jksfx009ezp",
  "url": "https://emulator.code.uzu-app.com/?endpoint=...",
  "expiresAt": "2026-10-06T12:34:56Z"
}

--json のときはビルドツールの出力も stderr へ寄せるので、npx uzu preview --json > preview.json がそのまま使えます。

uzu publish との違い ​

uzu publishuzu preview
リビジョン登録するしない
公開中のゲームへの影響配信対象になりうるなし
キャラクターアイコンアップロードするしない (emulator では使わないため)
実体の寿命無期限14 日ほどで削除される
触る手段UZU Studio / アプリemulator のリンク

ビルドからアップロードまでの経路は両者で同じです。uzu preview で動いたものは uzu publish でも同じように動きます。

WARNING

プレビューのリンクを知っていれば誰でも部屋に入れます。推測できない ID を使っているので 総当たりでは辿り着けませんが、リンク自体は公開前のシナリオを開ける鍵です。共有範囲に注意してください。

有効期限 ​

アップロードした実体は 14 日ほどで自動的に削除されます。削除後はリンクを開いても 404 になります。 長く開いている PR で期限が切れたら、uzu preview を実行し直して新しいリンクに差し替えてください。 毎回別の ID になるので、古いリンクが新しいビルドを指すことはありません。

削除は自動なので、後片付けのコマンドはありません。

PR に貼る ​

uzu preview は CI からも実行できます。認証は uzu publish と同じ publish token を使います (発行方法と対応環境は CI から publish する を参照)。

1 回あたり数百 MB をアップロードするので、全 push ではなくラベルか /preview コメントで起動するのが無難です。 次は /preview コメントで起動し、結果を 1 つのコメントに上書きし続ける例です。

yaml
name: Preview

on:
  issue_comment:
    types: [created]

permissions:
  contents: read
  pull-requests: write

jobs:
  preview:
    if: github.event.issue.pull_request && startsWith(github.event.comment.body, '/preview')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
        with:
          ref: refs/pull/${{ github.event.issue.number }}/head
      - uses: actions/setup-node@v6
        with:
          node-version: 20
      - run: npm ci

      - id: preview
        working-directory: packages/play
        run: npx uzu preview --json --label "PR #${{ github.event.issue.number }}" > preview.json
        env:
          UZU_PUBLISH_TOKEN: ${{ secrets.UZU_PUBLISH_TOKEN }}

      - working-directory: packages/play
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          url=$(jq -r .url preview.json)
          printf '**Preview**: %s\n\n14 日ほどで開けなくなります。切れていたら `/preview` を投げ直してください。\n' "$url" \
            | gh pr comment ${{ github.event.issue.number }} --body-file - --edit-last --create-if-none

working-directory は manifest.json のある場所に合わせます (ワークスペース構成のシナリオなら packages/play など)。

WARNING

refs/pull/<n>/head は PR の作者が書いたコードをそのまま実行します。フォークからの PR を 受け付けるリポジトリでは、/preview を投げられる人を絞る条件を足してください (github.event.comment.author_association の確認など)。