Claude CodeのスピナーTips追加コマンドを作る

2026年3月1日 結城浩×クロコさん(Claude Code)

スピナーTipsとは

human
結城浩

Claude Codeのスピナーの部分にテキストを入れられるという話がありますよね。たとえば、私の~/.claude/settings.jsonは、いまこうなっています。

...
"spinnerTipsOverride": {
  "excludeDefault": false,
  "tips": [
    "スピナーのTipsはカスタマイズできます。クロコにお伝えください。"
  ]
},
...
ai
クロコ

はい、Claude Codeには、スピナー(作業中に表示されるインジケーター)にカスタムテキストを表示できる機能があります。
結城さんの現在の設定を見ると、excludeDefault: false でデフォルトのTipsも表示されつつ、tips 配列にカスタムTipsを追加できるようになっています。

スピナー

コマンドの作成

human
結城浩

いまやりたいのは、この ~/.claude/settings.json の tips 配列に文字列を挿入するユーティリティコマンドを作ってほしいということです。claude-add-tips "ここにテキスト" のような使い方で。

ai
クロコ

はい、作りました。追加だけでなく、一覧表示(-l)と削除(-d N)もできるようにしています。重複チェック付きなので、同じテキストは二重に追加されません。

エッジケースの確認

human
結城浩

たとえば~/.claude/settings.jsonspinnerTipsOverride.tips が存在しないときはどうなりますか。

ai
クロコ

キーが存在しない場合は自動的に作成することになります。

human
結城浩

じゃあ、~/.claude/settings.json がない場合は?

ai
クロコ

~/.claude/settings.json が存在しない環境でClaude Codeを使っているとは考えにくいので、エラーメッセージだけ出して終了するようにしてあります。

完成したスクリプト

最終的なスクリプト ~/bin/claude-add-tips の全文は次の通りです。

#!/usr/bin/env ruby
# encoding: utf-8
# claude-add-tips - ~/.claude/settings.json の spinnerTipsOverride.tips を管理する
#
# Usage:
#   claude-add-tips "ここにテキスト"
#   claude-add-tips "テキスト1" "テキスト2"   # 複数同時追加
#   claude-add-tips -l                         # 現在のtips一覧
#   claude-add-tips -d N                       # N番目を削除(1始まり)
#   claude-add-tips -h                         # ヘルプ表示

require 'json'

SETTINGS_PATH = File.expand_path('~/.claude/settings.json')

HELP = <<~HELP
  claude-add-tips - Claude Code スピナーTipsの管理

  Usage:
    claude-add-tips "テキスト"              tipsを追加
    claude-add-tips "A" "B"                複数同時追加
    claude-add-tips -l, --list             一覧表示
    claude-add-tips -d, --delete N         N番目を削除(1始まり)
    claude-add-tips -h, --help             このヘルプ

  Tips は ~/.claude/settings.json の spinnerTipsOverride.tips に保存されます。
  Claude Code 作業中にスピナー横にランダム表示されます。

  備考:
    - ~/.claude/settings.json が存在しない場合はエラー終了します。
    - spinnerTipsOverride キーが存在しない場合は自動作成されます。
    - 同じテキストの重複追加はスキップされます。
HELP

def load_settings
  unless File.exist?(SETTINGS_PATH)
    $stderr.puts "エラー: #{SETTINGS_PATH} が見つかりません"
    exit 1
  end
  JSON.parse(File.read(SETTINGS_PATH))
end

def save_settings(settings)
  File.write(SETTINGS_PATH, JSON.pretty_generate(settings) + "\n")
end

def ensure_tips_structure(settings)
  settings['spinnerTipsOverride'] ||= { 'excludeDefault' => false, 'tips' => [] }
  settings['spinnerTipsOverride']['tips'] ||= []
  settings
end

def list_tips
  settings = ensure_tips_structure(load_settings)
  tips = settings['spinnerTipsOverride']['tips']
  if tips.empty?
    puts "Tips は空です。"
  else
    tips.each_with_index do |tip, i|
      puts "  #{i + 1}. #{tip}"
    end
  end
end

def delete_tip(index)
  settings = ensure_tips_structure(load_settings)
  tips = settings['spinnerTipsOverride']['tips']
  if index < 1 || index > tips.length
    $stderr.puts "エラー: #{index} 番は範囲外です(1〜#{tips.length})"
    exit 1
  end
  removed = tips.delete_at(index - 1)
  save_settings(settings)
  puts "削除: #{removed}"
end

def add_tips(new_tips)
  settings = ensure_tips_structure(load_settings)
  tips = settings['spinnerTipsOverride']['tips']
  new_tips.each do |tip|
    if tips.include?(tip)
      puts "スキップ(既存): #{tip}"
    else
      tips << tip
      puts "追加: #{tip}"
    end
  end
  save_settings(settings)
end

# --- main ---
case ARGV[0]
when '-h', '--help', nil
  puts HELP
when '-l', '--list'
  list_tips
when '-d', '--delete'
  unless ARGV[1]
    $stderr.puts "エラー: 削除する番号を指定してください"
    exit 1
  end
  delete_tip(ARGV[1].to_i)
else
  add_tips(ARGV)
end

使い方まとめ

コマンド 動作
claude-add-tips "テキスト" Tipsを追加
claude-add-tips "A" "B" 複数同時追加
claude-add-tips -l / --list 一覧表示
claude-add-tips -d N / --delete N N番目を削除
claude-add-tips -h / --help ヘルプ

関連リンク

フィードバックはこちらから

(2026年3月1日)