下記の記事で、Stream DeckからCodexのSkill一覧を表示し、その中から使いたいSkillを選択して実行する「Codex Skill Launcher」を紹介しました。その記事でも言及しましたが、Skill一覧からSkillを選択するボタンの他に、特定のSkill専用のボタンもいくつか設けるのが現実的だと思ったので、本記事では専用ボタン(専用ランチャー)を設ける方法を検討したのでその内容を紹介します。それらの専用ボタンはStream Deck側へSkillそのものを固定するのではなく、間に「Slot」を置くことで、後からSkillだけを簡単に差し替えられるようにしました。

注)本記事の内容は正確性を保証するものではない。
今回作りたかったもの
目標とした操作は、とても単純です。
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 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 1へSkillを設定する場合は、専用のアプリを立ち上げ、設定するボタン、そのボタンに割り当てるSkillを選択し、Stream Deckのボタンに「システム」の「開く」のappの欄に
“/Users/matsufusa/Applications/Codex Skill Slot 設定 v2.8.3.app”を入力するように構成した。



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方式の大きな利点だと思います。

使用手順
ここからは、普段使用するときの操作だけをまとめます。
1. SkillをSlotへ割り当てる
専用アプリを立ち上げ、表示されたSkill一覧から使用するSkillを選択します。
2. 現在の割り当てを確認する
専用アプリを立ち上げ、現在の割り当てを確認します。
3. Stream Deckへボタンを作る
Elgato Stream Deckアプリを開きます。
使用するボタンへ、
「システム → 開く」
を配置します。
4. Slotに対応するcommandファイルを指定する
Slot 1なら、
/Users/ユーザー名/Scripts/CodexSkillLauncher/run_slot_1.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 が正常に実行されるところまで確認しました。
