dwgx@blog:~$dwgx
> cd ../posts

SKIBOX: 山ほどある AI ツールの API Key をまとめて管理する

// created

SKIBOX はターミナルで動く API key の管理役だ。マシンには claude code、codex、cline、gemini cli、openclaw と AI コーディングツールが山ほど入っていて、それぞれ key を置く場所もフォーマットもバラバラだ。token を差し替えたり、あるツールを別のバックエンドに切り替えたりするたびに、設定ファイルを一つずつ開いて手で直すことになり、一文字間違えれば半日かけて原因を追う羽目になる。SKIBOX はこれを一括で片付ける。OpenAI 互換バックエンドにログインし(デフォルトは自分の https://skiapi.dev を挂けているが、自前のものに差し替えられる)、TUI で token を参照・作成・削除・切り替えする。選んだものを、そのままローカルの各 AI ツールの設定ファイルに書き込むので、もう手動で編集する必要はない。これがコアだ。

ついでにチャット画面も入れた。バックエンドのモデル一覧を引いて一つ選べば、ターミナルでそのままチャットでき、ストリーミングにも対応している。設定は自分や他のツールにしょっちゅう壊されるので、異常を検出して自動修復を試みる診断機能を付けた。

ターミナル完結のものは起動が速く、単一ファイルで、クロスプラットフォームで手軽に動くべきなので Go を使った。インターフェースは charm 一式でいく。TUI は Bubble Tea、コンポーネントは Bubbles、スタイルは Lip Gloss、Markdown レンダリングは Glamour に任せ、設定の読み書きは Viper。更新ロジックはステートマシンで、ログイン・メイン画面・チャット・初期化・修復といった画面の切り替えがすっきりしている。

一番手をかけたのは toolswitch で、他人の設定に token を差し込む部分だ。ツールごとに構造が違うので、一つずつ適応させる必要がある。ファイルを書くときに一番怖いのは、途中でクラッシュして相手の設定を壊してしまうことなので、アトミック書き込みにした。まず一時ファイルに書いてから rename する。fileutil がこれをやっている。プラットフォームごとのパスは別途 platform に渡して検出と組み立てを担わせる。

ログインはユーザー名とパスワード、加えてオプションで 2FA に対応する。データはローカルにしか残さず、リポジトリには書き戻さない。設定は ~/.skibox/config.json、チャット履歴は ~/.skibox/sessions.json にある。初期は ~/.skiapi-helper/ を使っていたので、新しいファイルが無ければ古いパスを読みに行って移行する。

ソースからのビルドには Go 1.24.2 以上が必要だ。スクリプトはリポジトリ内のローカル Go/ ツールチェーンを優先し、無ければシステムの go にフォールバックする。Windows は build.bat release、mac は build-mac.bat release、あるいは一番手っ取り早く go build -o skibox.exe。開発では普段 go run . で済ませている。MIT。