みなさんVibe Cording
もといVibe Engineering
してますか?
私はもっぱらAI様にコードを書いてもらっています😅
いつものように電車の中でCodex CLI使ってVibe Cordingしていたところ、自分で書かないなら別にPC持ち歩く必要なくね?
と思ってしまいました。承認するだけであればスマホで十分、いつでもVibe Cordingできたらどれだけ幸せだろうか!
そこで、LINEからVibe Cordingできるデスクトップアプリを作ってみました!
LINEでVibe Cordingできて幸せ!
Web版 Codexじゃダメなの?
ダメです (多分)
理由はテストを失敗するからです。 (もしかすると今は大丈夫かも)
Claude Code, Codex CLIをはじめとしたAIコーディングエージェントの素晴らしいところは、テストを実行してコード品質を担保しながら実装を勧められる点
だと思っています。 じゃなかったらGPTに聞いてコピペでいいだろ
Web版Codexでも試してみましたが、testが安定して実行できず、家に帰って動かしてみたらバグだらけ😭 まともに動かず Codex CLIが 大量に修正することとなりました🥺
ということで、test実行環境を確保してVibe Cordingするためにもローカルで動作しているコーディングエージェントを遠隔操作する方針にて進めることとしました
実装概要
以下、Codex CLIをターゲットに実装を進めています。理由は私がよく使うからです
README.md丁寧に記述してあるので読んでいただければと思います
必要な機能は3つです
- デスクトップから通常通りCodex CLIを実行
- LINEからCodex CLIに命令を出す
- Codex CLIの作業が完了したら、LINEに通知する
前2つは今回のコンセプトなので言わずもがな。
LINE通知については、出先はもちろんPCで作業していたとしても数十分単位のタスクを任せて掃除をしていても終了がわかるようにと思い、実装することとしました。
構成

普段はターミナルのようなshellの環境で動いているCodex CLIに対して外部から指示を出すために、デスクトップアプリ: Tauri内でCodex CLIを実行
外部(LINE)からのイベントを受け付けるためにserverとしての役割をCloudflare workersに担わせつつ、TauriとのやりとりはCloudflare Durable objectでSSEを張ることで実装
Codex CLIからのストリーム終了を検知し、LINE Messaging APIよりPush Messageを送信することで、完了を通知
構成ファイル類
{
"name": "agent-monitor",
"private": true,
"version": "0.1.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview",
"tauri": "tauri",
"lint": "biome lint .",
"format": "biome format --write ."
},
"dependencies": {
"@tailwindcss/vite": "^4.1.13",
"@tauri-apps/api": "^2",
"@tauri-apps/plugin-dialog": "^2.4.0",
"@tauri-apps/plugin-opener": "^2",
"lucide-react": "^0.545.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"tailwindcss": "^4.1.13",
"xterm": "5.3.0",
"xterm-addon-fit": "0.8.0"
},
"devDependencies": {
"@biomejs/biome": "^2.2.6",
"@tauri-apps/cli": "^2",
"@testing-library/jest-dom": "^6.8.0",
"@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^14.6.1",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"@vitejs/plugin-react": "^4.6.0",
"@vitest/coverage-v8": "^3.2.4",
"jsdom": "^26.1.0",
"msw": "^2.11.1",
"typescript": "~5.8.3",
"vite": "^7.0.4",
"vitest": "^3.2.4"
}
}
[package]
name = "agent-monitor"
version = "0.1.0"
description = "A Tauri App"
authors = ["you"]
edition = "2021"
build = "build.rs"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lib]
# The `_lib` suffix may seem redundant but it is necessary
# to make the lib name unique and wouldn't conflict with the bin name.
# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519
name = "agent_monitor_lib"
crate-type = ["staticlib", "cdylib", "rlib"]
[build-dependencies]
tauri-build = { version = "2", features = [] }
[dependencies]
tauri = { version = "2", features = [] }
tauri-plugin-opener = "2"
tauri-plugin-dialog = "2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
expectrl = "0.7.1"
reqwest = { version = "0.12", features = ["json", "rustls-tls"] }
dotenv = "0.15.0"
{
"name": "agent-monitor-server",
"private": true,
"version": "0.1.0",
"type": "module",
"scripts": {
"dev": "wrangler dev",
"start": "wrangler dev",
"deploy": "wrangler deploy",
"test": "vitest run",
"lint": "biome lint .",
"format": "biome format --write ."
},
"dependencies": {
"hono": "^4.6.9"
},
"devDependencies": {
"@biomejs/biome": "^2.2.6",
"@cloudflare/workers-types": "^4.20240925.0",
"typescript": "^5.8.3",
"vitest": "^2.1.4",
"wrangler": "^3.78.0"
}
}
動作
![]()
立ち上げたところ。SSE接続しつつ、作業するフォルダを選択します。
エージェントはCodexとGeminiに対応してます。
通知が不要なときは切れるように、右上にトグルスイッチを入れました。
![]()
SSE接続してエージェントを立ち上げた状態。
通常のコーディングエージェントと同じ感じで使えます。
この状態でも作業が完了するとLINEに通知がきます。
長いタスクを任せて掃除をしても、終了がわかります
実際にLINEから使ってみます!
![]()
LINEからCodex CLIに命令し、実際のタスクを実行できました
受け付けた時点で受付のReply、完了後に内容をPushで受け取ります
参考|本当にTDDできるのか
少し長めのタスクをやらせています。
具体的には、useState
で作成したcount up
するコンポーネントについて
-
count down
,reset
を追加 - useReducerに切り替えてreducer関数へのunit testを記述
- vitest, biomeのlintが通るまで改善
という感じです。
特に落ちることもなく、最後まで実行。完了報告まで実行してくれました。
![]()
testとlintまで実行してくれたので当然動きます
コーディングエージェントがすごい
実際、このデスクトップアプリを実装するにあたっても、Codex CLIに大半のコードを記述してもらいました。
その中でもたくさんのことを学ぶことができました。
- Cloudflareからの安定したSSEには
Durable Object
が必須 - Tauriのbuildには
.env
を含めることができないため、Build時に環境変数を埋め込むためのファイルをと元となるテンプレートを用意。環境変数を埋め込むファイルは.gitignore
管理する
この辺りは実装開始した当初想定外でしたが、Codexと一緒に決めていきました。
それでは、皆さんも楽しいVibe Cording Lifeを!!