非エンジニアでもターミナルを使えるようにしたい。
そんな発想から、「自然言語で操作できるターミナル」を作ってみました。
はじめに
自分はエンジニアではありません。
小中学生にSTEAM教育を指導する傍ら、AIや開発ツールを日常的に使っています。そのなかで避けて通れないのが「ターミナル」でした。
触れるたびに感じる違和感がありました。
「これ、普通の人が使う前提で作られてないな」
その感覚が出発点です。
ターミナルの何が問題なのか
実際に使っていて感じた問題を整理するとこうなります。
| 問題 | 体感 |
|---|---|
| コマンドを覚えないと何もできない | 辞書を丸暗記しないと読めない言語みたい |
| ミスるとエラーが出る | しかもエラーメッセージが分かりにくい |
| 何が起きているか分からない | 黒い画面に文字が流れるだけ |
エラー(Error)とは、コンピュータが「うまくいかなかった理由」を出力するメッセージです。慣れれば手がかりになりますが、初見では暗号です。
なぜ難しいのか——構造の問題
スキル不足ではなく、インターフェースの設計思想がズレているのだと思っています。
- 人間は 「言葉」 で考える
- ターミナルは 「記号(コマンド)」 で動く
このギャップがある限り、非エンジニアにとってターミナルはずっと"習得コスト"を要求してきます。
解決の方向性
逆転の発想で考えました。
- コマンドを覚えなくてもいい
- 自然言語で操作できる
- UIで状態が可視化される
ツールが人間に寄せてくれればいい。
AI時代ならそれが実現できるはず。
作ったもの——Shelly
「Shelly」は、自然言語で操作できるターミナルIDEです。
コマンドを知らなくても、日本語で指示するだけで動きます。
ユーザー: プロジェクトのフォルダを作って
Shelly: → mkdir my-project && cd my-project を実行します
裏では通常のCLI(コマンドライン)が動いていますが、ユーザーはそれを意識する必要がありません。
技術構成
スタック
| レイヤー | 技術 |
|---|---|
| フロントエンド | React Native 0.81 / Expo 54 / TypeScript |
| スタイリング | NativeWind(TailwindCSS 3) |
| 状態管理 | Zustand |
| パッケージ管理 | pnpm 9.12 |
| ビルド | GitHub Actions → APK |
| 実行環境 | Termux(Android上のLinux環境) |
接続アーキテクチャ
Shellyのターミナル接続は、用途別に3経路を使い分けています。
- WebSocket + Node.js Bridge:チャットからコマンドを実行するメインルート
- WebView + ttyd:完全なインタラクティブTTY。日本語入力もここで実現
- Kotlin Native Module:バックグラウンドでのコマンド実行
AIマルチエージェントルーティング
@mention でAIを使い分けられます。
| メンション | エージェント |
|---|---|
@claude |
Claude Code(永続セッション) |
@gemini |
Gemini CLI |
@groq |
Groq |
@cerebras |
Cerebras |
@local |
ローカルLLM(llama-server / Ollama) |
@team |
複数AIに並列実行、結果をマージ |
@team は同じプロンプトを複数のAIに投げて、回答を横並びで比較できます。
プロセス管理
Android上で長時間プロセスを安定させることは難しく、自動リカバリの仕組みを実装しています。
- Auto-Recovery:Termuxがクラッシュしたとき自動再起動を試みる。失敗時はTermuxアプリを開き、リカバリコマンドをクリップボードにコピー
- Auto-Savepoint:AIの応答完了・ファイル変更コマンド実行・30秒アイドルをトリガーにgit commitを自動生成。ユーザーにGitの知識は不要
-
Undoボタン:チャットバブルごとにタップ1つで
git revert
最大の差別化ポイント:クロスペインインテリジェンス
Shellyの核心はここにあります。
CLIツールを使っていると、毎日これを繰り返します。
- ターミナルにエラーが出る
- コピーする
- チャットに切り替える
- ペーストする
- 回答を読む
- 修正コマンドをコピーする
- ターミナルに戻る
- ペーストして実行する
8ステップを、0ステップにするのがクロスペインインテリジェンスです。
「右のエラー直して」と言うだけで、AIが左のターミナル出力を読み取り、原因を説明し、実行可能なコマンドを提示します。実行は1タップ。
Samsung Galaxy Z Fold6のような折りたたみスマートフォンは、画面を広げると2ペイン表示ができます。左にAIチャット、右にターミナル。エラーが出ても、画面を切り替える必要すらありません。
技術的な仕組み
- xterm.jsのバッファをポーリング(500ms)してターミナル出力をキャプチャ
- ANSIエスケープコードを除去(
lib/strip-ansi.ts) - ホットバッファ(直近100行)+セッションバッファ(1000行・エラー優先)の二重構造
- 「右のエラー直して」「ターミナルの出力を見て」などの日本語パターンを検知してAIコンテキストに自動注入
できること(v1.0)
| 機能 | 説明 |
|---|---|
| 自然言語でコマンド実行 | 「このパッケージをインストールして」→ コマンドに変換して実行 |
| エラーの自動解説 | ターミナル出力をAIが日本語で解説 |
| 環境セットアップ | 「Node.jsの開発環境を作って」→ 一連の処理を自動化 |
| Planモード | 複数ステップの作業内容を実行前に確認 |
| VoiceChain | 音声入力でターミナルを操作 |
| リアルタイム翻訳 | CLIの英語出力を即時日本語化(Cerebras → Groq → ローカルLLM) |
| WebViewプレビュー | AIが生成したHTMLをチャット内でプレビュー |
| Undoボタン | チャットバブルから1タップで直前の変更を巻き戻し |
v2.0以降で開発予定
- GitHub連携(「GitHubに公開して」ワンタップフロー)
- エージェント間並列タスク実行(
@claudeと@geminiに別々の作業を同時依頼)
開発環境について
Shellyは、Shelly自身の上で開発されています。
開発環境はSamsung Galaxy Z Fold6 + Termux + Claude Codeです。PCは使っていません。自分でコードを書くことはなく、すべてAIとの会話で構築しました。コードベースはTypeScriptで10万行を超えています。
モバイルファーストの開発を突き詰めた結果、「ターミナルを誰でも使えるようにするツールを、そのツール自身で作る」という状況になっています。
設計上の決断:除外したもの
意図的に実装しなかった機能があります。
| 機能 | 理由 |
|---|---|
| MCPプロトコル |
@mention ルーターで同じことができる。MCPのツール定義だけでコンテキストの40〜50%を消費するという報告もある |
| 自律エージェントモード | Shellyの思想(ユーザーが対話しながら作る)と逆行する |
| クラウド実行 | 「1台のスマホで完結する」という価値を壊す |
ライセンス・OSS化について
GPL v3でOSSとして公開しています。
スターやフィードバック、IssueやPRを歓迎しています。
技術的なフィードバックも特に歓迎しています。ターミナル出力キャプチャの効率化(MutationObserver vs ポーリング)や、ActionBlockの安全チェック閾値など、知見のある方はぜひIssueで。
まとめ
ターミナルは本来もっと自由なものだと思っています。
- コマンドを覚えなくていい
- エラーに怯えなくていい
- 誰でも使えるべき
「人間がツールに合わせる」ではなく、「ツールが人間に合わせる」 方向に進むべきだというのが、Shellyを作り続けている理由です。
非エンジニアが感じた限界のひとつひとつが、そのままエンジニアにとっても必要な機能になっていました。
AI時代に、ターミナルの敷居を下げる。
そのひとつの答えとして、Shellyを公開します。
