はじめに
AI CLIを並行利用していると、「今どのAIで作業しているか」を一目で識別したくなります。
今回は、AI起動時にターミナル背景色を自動変更する仕組みを作りました。
元ネタ
まず、着想の元になったメモはこちらです(ありがとうございます)。
このアイデアをベースに、今回はこちらの方向に拡張しました。
-
cwdだけでなく AI/プロダクト軸(Claude系・Codex系)で色を分ける - 同系色の中で
cwdに応じて微妙に変化させる -
claude/codex起動時に自動適用し、終了時にリセット
何を実装したか
1. 背景色決定スクリプト(~/bin/term-bg)
provider + product + path から色を決定して、OSC 11で背景色を変更します。
#!/usr/bin/env python3
import argparse
import colorsys
import hashlib
import os
import sys
PROVIDER_BASE = {
"claude": (28.0, 0.72, 0.18),
"codex": (205.0, 0.70, 0.17),
"gemini": (150.0, 0.66, 0.17),
"gpt": (188.0, 0.64, 0.17),
"cursor": (332.0, 0.58, 0.18),
}
PRODUCT_SHIFT = {
"code": -8.0,
"cli": -10.0,
"chat": 0.0,
"api": 10.0,
"desktop": 5.0,
"web": 3.0,
"agent": -3.0,
}
def clamp(v, lo, hi):
return max(lo, min(hi, v))
def ai_palette_color(provider, product, path):
base_h, base_s, base_l = PROVIDER_BASE.get(provider, (278.0, 0.56, 0.18))
product_shift = PRODUCT_SHIFT.get(product, 0.0)
seed = hashlib.md5(f"{provider}:{product}:{path}".encode()).hexdigest()
bucket = [-2.0, -1.0, 0.0, 1.0, 2.0][int(seed[0], 16) % 5]
fine_h = ((int(seed[1:3], 16) / 255.0) - 0.5) * 4.0
hue_deg = (base_h + product_shift + bucket * 6.0 + fine_h) % 360.0
sat = clamp(base_s + (((int(seed[3:5], 16) / 255.0) - 0.5) * 0.08), 0.46, 0.82)
lit = clamp(base_l + (((int(seed[5:7], 16) / 255.0) - 0.5) * 0.03), 0.12, 0.24)
return hue_deg / 360.0, sat, lit
def main():
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument("path", nargs="?", default=os.getcwd())
parser.add_argument("--path", dest="path_opt")
parser.add_argument("--provider", default="")
parser.add_argument("--product", default="")
parser.add_argument("--show", action="store_true")
args = parser.parse_args()
path = args.path_opt or args.path
provider = args.provider.strip().lower()
product = args.product.strip().lower()
hue, sat, lit = ai_palette_color(provider, product, path)
r, g, b = colorsys.hls_to_rgb(hue, lit, sat)
ri, gi, bi = int(r * 255), int(g * 255), int(b * 255)
sys.stdout.write(f"\\033]11;rgb:{ri:02x}/{gi:02x}/{bi:02x}\\033\\")
if args.show:
print(f"{provider}:{product} {path} -> #{ri:02x}{gi:02x}{bi:02x}")
if __name__ == "__main__":
main()
実行権限:
chmod +x ~/bin/term-bg
2. ~/.bashrc に起動ラッパーを追加
AIコマンド起動前に色を設定し、終了後にリセットします。
term-bg() { python3 ~/bin/term-bg "$@"; }
term-bg-reset() { printf '\033]11;rgb:00/00/00\033\\'; }
_run_with_ai_bg() {
local provider="$1"
local product="$2"
local cmd="$3"
shift 3
term-bg --provider "$provider" --product "$product" --path "$PWD"
command "$cmd" "$@"
local exit_code=$?
term-bg-reset
return $exit_code
}
claude() { _run_with_ai_bg "claude" "code" "claude" "$@"; }
codex() { _run_with_ai_bg "codex" "cli" "codex" "$@"; }
反映:
source ~/.bashrc
どう変わったか
同じディレクトリでも、AIで背景が明確に変わります。
-
claude:code-> 暖色系 -
codex:cli-> 青系
--showで確認できます。
~/bin/term-bg --provider claude --product code --path "$PWD" --show
~/bin/term-bg --provider codex --product cli --path "$PWD" --show
元ネタとの差分
元ネタ(cwdベース)に対して、今回の実装は以下が主な差分です。
-
cwd単独ではなくprovider + product + cwdで色を決定 - AIごとにベースパレットを固定(Claude系 / Codex系)
- シェル関数で自動適用(起動時セット、終了時リセット)
注意点
- OSC 11が効くターミナルで動作します(端末によっては無効)
- 背景を濃くする場合、文字色とのコントラストに注意
- tmux環境では端末設定によって反映可否が変わる場合があります
この記事の作業体制(明示)
今回の公開までの流れは次の通りです。
- 記事の構成・本文ドラフト作成: AI(Codex)が実施
- 技術内容の整理と実装内容の反映: AI(Codex)が実施
- Qiita CLIでの投稿作業(init/login/new/publish): AI(Codex)が実行
- 認証トークン発行など本人操作が必要な部分: ユーザー(著者)が補助
つまり、"あなたが補助し、AIがまとめて公開まで実行した" という体制です。
おわりに
「見た目で文脈を切り替える」のは地味に効きます。
複数AIを往復する人にはおすすめです。