Stream Deckの1ボタンからCodex Skillを直接実行する専用ランチャーを作った

下記の記事で、Stream DeckからCodexのSkill一覧を表示し、その中から使いたいSkillを選択して実行する「Codex Skill Launcher」を紹介しました。

その記事でも言及しましたが、Skill一覧からSkillを選択するボタンのほかに、特定のSkill専用のボタンもいくつか設けるのが現実的だと思ったので、本記事では専用ボタン(専用ランチャー)を設ける方法を検討したので、その内容を紹介します。

それらの専用ボタンは、Stream Deck側へSkillそのものを固定するのではなく、間に「Slot」を置くことで、後からSkillだけを簡単に差し替えられるようにしました。


注)本記事の内容は正確性を保証するものではありません。

(2026年8月29日 追記)YouTube動画を追加しました。 https://youtu.be/6fkjSuggHjk

目次

今回作りたかったもの

目標とした操作は、とても単純です。

Stream Deckのボタンを押す
        ↓
ボタンに対応したSlotを呼び出すSlotに割り当てられたSkillを確認
        ↓
Codex CLIを起動
        ↓
Skillを直接実行

実機では、Stream Deckの上段左端に「検索KW提案」というボタンを用意し、

recent-blog-search-keywords

を直接実行できるところまで確認しました。

ボタン「検索KW提案」を押すと、Codex CLIが立ち上がり、ボタンに設定されたSkill(recent-blog-search-keywords)が実行されます。

Skill一覧は表示されません。

よく使うSkillなら、一覧から探して選択するより、この方法の方が操作を大幅に減らせます。

既存のSkill一覧ランチャーは残す

今回、既存のSkill一覧ランチャーを置き換えたわけではありません。

これまでのランチャーには、

  • Skill一覧
  • 最近使ったSkill
  • よく使うSkill
  • そのまま実行
  • 今回だけ追加指示
  • 定型指示付きで実行

といった機能があります。

これらは残したまま、新しく「Skill専用ボタン」を追加しました。

使い分けとしては、

よく使うSkill
        ↓
Stream Deckの専用ボタンから直接実行

それ以外のSkill
        ↓
従来のSkill一覧から選択

という形になります。

Skillそのものではなく「Slot」を登録する

今回の仕組みで重要なのがSlot方式です。

Stream Deckのボタンへ、

recent-blog-search-keywords

のようなSkill名を直接登録するのではありません。

代わりに、

Slot 1
Slot 2
Slot 3
Slot 4
Slot 5
Slot 6
Slot 7
Slot 8

という8個のSlotを用意しました。

そして例えば、

Slot 1
  ↓
recent-blog-search-keywords

という割り当てを別に保存します。

Stream Deck側は「Slot 1を実行する」という設定だけです。

このため、後から別のSkillへ変更しても、Stream Deck側を設定し直す必要がありません。

変更するのはSlot 1の割り当てだけです。

Phase 1:SlotからSkillを直接実行+Phase 2:Skill一覧からSlotへ割り当てを実装

今回は、まず下記のPhase 1とPhase 2を実装しました。

Phase 1:SlotからSkillを直接実行

中心となるファイルは、

~/Scripts/CodexSkillLauncher/skill_slot_launcher.py

です。

Slot 1を直接実行する場合、私のMac環境では、

/opt/anaconda3/bin/python3 "/Users/ユーザー名/Scripts/CodexSkillLauncher/skill_slot_launcher.py" run --slot 1

とします。

処理は、

  1. Slot 1の設定を読む
  2. 割り当てられているSkillを確認する
  3. Codex CLIを起動する
  4. Skillを実行する

という流れです。

通常のSkill一覧は表示されません。

Phase 2:Skill一覧からSlotへ割り当てる

SlotへSkillを設定する操作については、Terminalで長いコマンドを入力しなくてもよいように、専用アプリを用意しました。

専用アプリを立ち上げると、まず設定するSlotを選択できます。

続いて、そのSlotへ割り当てるSkillを一覧から選択します。

Skillを選択すると、割り当てが保存されます。

この専用アプリは、既存の

~/Scripts/CodexSkillLauncher/skill_slot_launcher.py

の設定機能をGUIから呼び出すためのものです。

以前は、例えばSlot 1を設定する場合、

/opt/anaconda3/bin/python3 "/Users/ユーザー名/Scripts/CodexSkillLauncher/skill_slot_launcher.py" configure --slot 1

というコマンドをTerminalから実行していましたが、専用アプリを使うことで、この操作を画面上から行えるようにしました。

Stream Deckから呼び出すためにcommandファイルを用意

Stream Deckへ長いPythonコマンドを直接設定するのではなく、Slotごとに .command ファイルを用意しました。

Slot 1なら、

run_slot_1.command

です。

内容は、

#!/bin/zsh
exec /opt/anaconda3/bin/python3 \
"$HOME/Scripts/CodexSkillLauncher/skill_slot_launcher.py" run --slot 1

というシンプルなものです。

まずTerminalから、

~/Scripts/CodexSkillLauncher/run_slot_1.command

を実行し、正常にSkillが起動することを確認しました。

Stream Deckへボタンを設定

続いて、Elgato Stream Deckアプリを開きました。

ボタンへ、

システム → 開く

を設定し、Slot 1の場合は、

/Users/ユーザー名/Scripts/CodexSkillLauncher/run_slot_1.command

を指定します。

ボタン名は、Slot番号ではなく用途が分かるように、

検索KW提案

としました。

実機では、Stream Deckの1ページの上段左端へ配置しています。

これで、目的だった「1つのボタンから1つのSkillを直接実行」が実現できました。

Slot 1〜8まで用意した

Slot 1が正常に動いたため、Slot 2〜8用の .command もまとめて作成しました。

run_slot_1.command
run_slot_2.command
run_slot_3.command
run_slot_4.command
run_slot_5.command
run_slot_6.command
run_slot_7.command
run_slot_8.command

それぞれが、

--slot 1
--slot 2
--slot 3
...
--slot 8

に対応しています。

そのため、最大8個のSkill専用ボタンを作れます。

Slot 2〜8へ何のSkillを設定するかは、今後用途を検討してから決めることにしました。

Skillを変更してもStream Deck側は変更しない

この方式で特に便利なのが、Skillを変更するときです。

例えば現在、

Slot 1
  ↓
recent-blog-search-keywords

となっていても、専用アプリを実行して別のSkillを選べば、Slot 1の割り当てを変更できます。

Stream Deck側では、

run_slot_1.command

を呼び出す設定のままです。

つまり、

Stream Deckの設定
        ↓
      Slot 1
        ↓
割り当てるSkillだけ変更

という構造です。

Stream Deck側とSkill側を分離したことが、今回のSlot方式の大きな利点だと思います。

SkillによってはCodex CLI画面を表示しないようにしたい

ここまでの仕組みでは、Stream Deckの専用ボタンを押すと、Codex CLIが自動的に起動します。

例えば、

recent-blog-search-keywords

のように、実行結果(私のブログ記事をGoogle検索する際のキーワード候補を出力する)をCodex CLIの画面で確認してもよいSkillでは、この動作が便利です。

一方で、Skillには、

  • ファイルを同期する
  • 設定を書き換える
  • データを保存する
  • バックグラウンド処理だけを行う

といった、実行後にCodex CLIの画面を見る必要がないものもあります。

このようなSkillまで毎回Codex CLIの画面を開く必要はありません。

そこで、今後の拡張として、Skillごとに、

Codex CLIを表示する
Codex CLIを表示しない

を切り替えられるようにしたいと考えています。

2種類の実行モードを用意する

考えているのは、次の2種類です。

実行モード向いているSkillCodex CLI画面
表示モード結果を画面で読むSkill、対話が必要なSkill表示する
サイレントモード同期・保存・更新など、画面を見る必要がないSkill表示しない

例えば、

recent-blog-search-keywords
        ↓
表示モード
        ↓
Codex CLIを開いて結果を見る

一方、

sync-chatgpt-qa
        ↓
サイレントモード
        ↓
Codex CLI画面を出さずに実行

という使い分けです。

Slotの設定に実行モードも保存する

実装する場合は、SlotへSkill名だけでなく「実行モード」も保存する方法が分かりやすそうです。

例えば設定イメージは、

{
  "slot1": {
    "skill": "recent-blog-search-keywords",
    "display_mode": "terminal"
  },
  "slot2": {
    "skill": "sync-chatgpt-qa",
    "display_mode": "silent"
  }
}

のようになります。

実行時には、

Stream Deck
      ↓
Slotを確認
      ↓
Skillと実行モードを確認
      ↓
┌────────────────────┬────────────────────┐
│ terminal           │ silent             │
│                    │                    │
│ Codex CLIを表示     │ 画面を出さず実行     │
└────────────────────┴────────────────────┘

という分岐になります。

サイレント実行でもエラーは分かるようにする

ただし、画面を完全に表示しなくすると、処理に失敗しても気づかない可能性があります。

そのためサイレントモードでは、

正常終了
→ 何も表示しない

エラー発生
→ macOSのダイアログなどで知らせる

詳細
→ ログファイルへ保存

という構成がよさそうです。

ログの保存先としては、例えば、

~/Library/Logs/CodexSkillLauncher/

のような専用フォルダを用意すれば、必要なときだけ確認できます。

自動判定ではなく設定方式にしたい

「このSkillは画面表示が必要か」を自動判定する方法も考えられますが、誤判定の可能性があります。

そのため、SkillまたはSlotごとに、

表示する
表示しない

明示的に設定する方式の方が安全だと思います。

将来的には、専用の「Codex Skill Slot 設定」アプリで、

Skill:
最近の記事から検索キーワードを提案
recent-blog-search-keywords

実行時の画面:
● Codex CLIを表示
○ 画面を表示しない

のように選べるようにすると、TerminalやJSONを直接触らず設定できます。

さらに必要であれば、

1. Codex CLIを表示
2. サイレント実行
3. サイレント実行+完了通知

という3種類に拡張することも考えられます。

なお、この「SkillごとにCodex CLI画面を表示/非表示にする機能」は、本記事執筆時点ではまだ未実装で、今後追加を検討している機能です。

使用手順

ここからは、現在実装済みの機能について、普段使用するときの操作だけをまとめます。

1. SkillをSlotへ割り当てる

専用アプリを立ち上げ、表示されたSkill一覧から使用するSkillを選択します。

2. 現在の割り当てを確認する

専用アプリを立ち上げ、現在の割り当てを確認します。

3. Stream Deckへボタンを作る

Elgato Stream Deckアプリを開きます。

使用するボタンへ、

システム → 開く

を配置します。

4. Slotに対応するcommandファイルを指定する

Slot 1なら、

/Users/ユーザー名/Scripts/CodexSkillLauncher/run_slot_1.command

を指定します。

Slot 2なら、

run_slot_2.command

です。

5. 分かりやすいボタン名を付ける

今回の例では、

検索KW提案

としています。

6. ボタンを押す

ボタンを押すと、Codex CLIが起動し、そのSlotへ登録したSkillが直接実行されます。

Skill一覧から選択する操作はありません。

まとめ

別記事で紹介したSkillランチャーは、多数のSkillから使いたいものを探して実行するときに便利です。

一方、今回作ったSlot方式は、普段よく使うSkillをすぐに実行する用途に向いています。

よく使うSkill
→ Stream Deck専用ボタン

その他のSkill
→ Skill一覧ランチャー

という使い分けができます。

特に便利なのは、Stream DeckへSkillそのものを登録していない点です。

Stream Deck側ではSlotを呼び出す設定だけを残し、実際にどのSkillを動かすかは後から変更できます。

今回はSlot 1へ「最近の記事から検索キーワードを提案」を設定し、Stream Deckの上段左端に作った「検索KW提案」ボタンから、

recent-blog-search-keywords

が正常に実行されるところまで確認しました。

さらに今回の検討で、Skillによっては実行結果をCodex CLI画面で確認する必要がないことも分かりました。

そのため今後は、

結果を確認したいSkill
→ Codex CLIを表示して実行

同期・保存などのSkill
→ Codex CLI画面を表示せず実行

という切り替えもできるようにすると、Stream DeckからのSkill実行がさらに自然になると考えています。

この表示・非表示の切り替えについては、Slot設定アプリ側で実行モードを選択できるようにする方式を候補として、今後実装を検討する予定です。

目次