下記の記事で、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
とします。
処理は、
- Slot 1の設定を読む
- 割り当てられているSkillを確認する
- Codex CLIを起動する
- 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種類です。
| 実行モード | 向いているSkill | Codex 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設定アプリ側で実行モードを選択できるようにする方式を候補として、今後実装を検討する予定です。
