steamdev 一式を使った日常の開発サイクル。エージェント (Claude) が自律的に 回す場合もこの手順に従う。
- Deck 側: 開発者モード有効化 + devkit サービス有効 (公式手順どおり)
- ホスト側:
pip install paramiko zeroconf(またはpip install -e .) - ペアリング: 公式 SteamOS Devkit Client でペアリング済みなら不要
(同じ鍵を共有)。新規なら
steamdev -d <ip> register→ Deck 側で承認 steamdev -d <ip> sync-utils— デバイス側ヘルパスクリプト転送 (初回必須)- Linux ビルドする場合: WSL2 + docker +
deckbuild/deckbuild.sh image - プロジェクトに
deckproject.tomlを書く (docs/DECKPROJECT.md)
デバイス指定は毎回 -d <ip> か、環境変数 STEAMDEV_DEVICE で固定。
# 疎通確認 (Deck の電源が入っているか / どの状態か)
steamdev discover # LAN 探索 (mDNS)
steamdev status # OS/セッション/Steam クライアント状態
# ビルド → 送り込み → 起動 (1 コマンド)
steamdev project -p <proj> ship linux
steamdev project -p <proj> ship windows
# ビルド済みで送るだけなら
steamdev project -p <proj> deploy linux --start
# 起動・終了・切り替え
steamdev run <gameid> # 再起動 (前面化)
steamdev exec -- "pkill -f '<gameid>/exe名[.]ext'" # 終了 (下記の注意参照)
steamdev list # 入っているタイトル一覧
steamdev delete <gameid> # 削除# 画面確認 (エージェントの目)
steamdev screenshot -o shot.png
# プロセス確認
steamdev exec -- "pgrep -af devkit-game/<gameid>"
# タイトルの stdout (Steam ログ経由) をリアルタイム追跡
steamdev exec --stream -- "tail -F ~/.local/share/Steam/logs/console-linux.txt"
# ログ・クラッシュダンプ一括回収
steamdev logs --out ./devkit-logs
# 対話シェル / 任意コマンド
steamdev shell
steamdev exec -- "ls ~/devkit-game"アプリが REPL・HTTP・ソケットサービスを持つ場合 (krkrz の -replweb 等)、 localhost バインドでも SSH トンネルで届く:
# ホスト:18080 → Deck:8080 (アプリの待ち受けポート)
steamdev tunnel -L 18080:8080
# 逆方向: Deck 上のアプリ → ホスト側サービス
steamdev tunnel -R 18888:8000ライブラリからは LocalForward / RemoteForward (with 文対応)。
krkrz を -replweb 付きで起動すると Deck の 127.0.0.1:8899 に HTTP+SSE サーバが
立つ (localhost バインドなのでトンネル必須)。
- 起動コマンドに
-replwebを含めてデプロイ:deploy.command = "./krkrz data -replweb -loglevel=info"注意: 起動引数はショートカット登録時に Steam 側へ焼き込まれるため、 デバイス上の<gameid>-argv.jsonを書き換えても反映されない。引数変更は 再デプロイ (create-shortcut のやり直し) で行う。 - トンネル:
steamdev tunnel -L 18899:8899(ライブラリならLocalForward) - TJS 評価:
POST http://127.0.0.1:18899/cmdに式を body で送る。 応答 body は受理ステータスのみ ("0"/"1")。評価結果は SSEGET /eventsにログ ({"cls":"result","text":"=> ..."}) として流れる (直近 2000 行のバックログ付きなので後から接続しても拾える)。 - Agent API で操作・観測:
Agent.keyPress(13)/Agent.click(x,y)— 入力注入 (実入力と同経路)Agent.captureScreen('/tmp/cap.png')— エンジン内キャプチャ (次フレーム保存)- PNG は sftp で回収して目視確認
- アプリ側の追加 API は
WebServer.registerで公開できる (skill krkrz-webui 参照)
検証済みフロー: 評価 (1+2*3 => 7) → Enter 注入でデモ起動 → captureScreen →
ESC 注入で復帰、まで全て動作。
- Linux ネイティブ: settings
gdbserver = "1"→<deck-ip>:2345に gdb 直結 - Proton (Windows exe): settings
steam_play_debug = "1"+ VS リモートデバッガ (msvsmon が LAN 直結。セットアップは公式クライアントの機能を利用)
| 症状 | 原因と対処 |
|---|---|
| deploy 後に起動しない (無反応) | compat_tool=proton-experimental 等が Deck に未インストール。compat_log.txt に "not installed"。proton-stable を使う |
pkill -f <パターン> が exit 127 で失敗 |
パターンが自分のリモートシェルにマッチして自爆。krkrz64[.]exe のようにブラケットを挟む |
| Linux バイナリが即死 / 同梱 .so が使われない | 同梱 .so の soname リンク欠落 / RPATH なし。Steam 起動では LD_LIBRARY_PATH の先頭に /usr/lib 等が入るので LD_LIBRARY_PATH=. では SteamOS 側の同名 .so が勝つ。exe に $ORIGIN を DT_RPATH (--disable-new-dtags) で埋め込み soname リンクも同梱する。読まれた .so は /proc/<pid>/maps で確認 |
| Proton 初回起動が遅い | prefix 生成中。数十秒待つのが正常 |
| 外したはずの環境変数が効き続ける | devkit-utils の save_env は env が空だと何もせず、以前の ~/devkit-game/<gameid>-env.json が残る。steamdev deploy は env が空ならこのファイルを消す (古い steamdev で登録した title は再デプロイで消える) |
invalid gameid で deploy が失敗 |
gameid は ^[A-Za-z_][A-Za-z0-9_.]+$。ハイフン不可 (my-game_linux → my_game_linux) |
run-game 直後にプロセスが見えない |
Steam 側の処理に数秒〜十数秒ラグ。ポーリングで待つ |
| 新旧タイトルが両方画面に残る | 前に起動したものが裏に生存。pkill で明示終了 |
ビルドが _mm256_* 未定義で失敗 |
sniper SDK 既定の gcc-10 が古い。deckbuild は gcc-14 を既定にしている (DECKBUILD_CC/CXX で変更可) |
- 起動確認は「プロセス存在 + スクリーンショット」の 2 点セットで行う (プロセスがいても前面とは限らない。gamescope は最後に起動したものを前面化)
- 状態を変える操作 (delete / pkill / セッション再起動) の前に
statusとpgrepで現状を確認する steamos-get-statusは呼ぶたびに無線省電力を切る副作用がある (Deck のみ)。 高頻度ポーリングにはexec -- pgrep ...を使う- テスト後は
deleteでタイトルを消し、~/devkit-game/にゴミを残さない