5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

みなさんVibe CordingもといVibe Engineeringしてますか?
私はもっぱらAI様にコードを書いてもらっています😅

いつものように電車の中でCodex CLI使ってVibe Cordingしていたところ、自分で書かないなら別にPC持ち歩く必要なくね?と思ってしまいました。承認するだけであればスマホで十分、いつでもVibe Cordingできたらどれだけ幸せだろうか!

そこで、LINEからVibe Cordingできるデスクトップアプリを作ってみました!

スクリーンショット 2025-10-16 17.07.05.png

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で作業していたとしても数十分単位のタスクを任せて掃除をしていても終了がわかるようにと思い、実装することとしました。

構成

2025-10-16 18.04.27.png

普段はターミナルのようなshellの環境で動いているCodex CLIに対して外部から指示を出すために、デスクトップアプリ: Tauri内でCodex CLIを実行

外部(LINE)からのイベントを受け付けるためにserverとしての役割をCloudflare workersに担わせつつ、TauriとのやりとりはCloudflare Durable objectでSSEを張ることで実装

Codex CLIからのストリーム終了を検知し、LINE Messaging APIよりPush Messageを送信することで、完了を通知

構成ファイル類
package.json
{
	"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"
	}
}
src-tauri/Cargo.toml
[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"
server/package.json
{
	"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"
	}
}

動作

スクリーンショット 2025-10-16 22.50.46.png

立ち上げたところ。SSE接続しつつ、作業するフォルダを選択します。
エージェントはCodexとGeminiに対応してます。
通知が不要なときは切れるように、右上にトグルスイッチを入れました。

スクリーンショット 2025-10-16 22.43.41.png

SSE接続してエージェントを立ち上げた状態。
通常のコーディングエージェントと同じ感じで使えます。
この状態でも作業が完了するとLINEに通知がきます。
長いタスクを任せて掃除をしても、終了がわかります

実際にLINEから使ってみます!

IMG_3522.jpg

LINEからCodex CLIに命令し、実際のタスクを実行できました
受け付けた時点で受付のReply、完了後に内容をPushで受け取ります

参考|本当にTDDできるのか

少し長めのタスクをやらせています。
具体的には、useStateで作成したcount upするコンポーネントについて

  • count down, resetを追加
  • useReducerに切り替えてreducer関数へのunit testを記述
  • vitest, biomeのlintが通るまで改善

という感じです。
特に落ちることもなく、最後まで実行。完了報告まで実行してくれました。

fromgyazo

testとlintまで実行してくれたので当然動きます

コーディングエージェントがすごい

実際、このデスクトップアプリを実装するにあたっても、Codex CLIに大半のコードを記述してもらいました。
その中でもたくさんのことを学ぶことができました。

  • Cloudflareからの安定したSSEにはDurable Objectが必須
  • Tauriのbuildには.envを含めることができないため、Build時に環境変数を埋め込むためのファイルをと元となるテンプレートを用意。環境変数を埋め込むファイルは.gitignore管理する

この辺りは実装開始した当初想定外でしたが、Codexと一緒に決めていきました。
それでは、皆さんも楽しいVibe Cording Lifeを!!

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?