Claude Codeで侍風ナレーションを活用し作業を楽しく可視化する方法

  • URLをコピーしました!
目次

Claude Code ユーザーが日常でぶつかる悩み

Claude Code で日々開発を進めていると、ターミナル操作やコマンド実行のたびに「もう少しテンションが上がる演出が欲しい」と感じる瞬間がある。特に長時間の作業や、単調なコマンド入力が続くと、集中力が切れたり、作業のリズムが単調になりがちだ。通知や進捗表示が淡々としているため、周囲の空気も重くなりがちだが、ちょっとした演出で雰囲気が変わることもある。

  • Claude Code でコマンドを実行しても、出力が事務的でテンションが上がらない
  • 長時間のAI coding workflowで、作業がマンネリ化しやすい
  • onboarding や session 開始時、repo の説明や context の切り替えが淡々と進んでしまう
  • monorepo で複数の directory をまたぐとき、作業の切り替え感が希薄で、気分転換のきっかけが欲しい
  • 周囲の目を引くような「遊び心ある通知」や「演出」が無く、会話のきっかけにならない

通知・演出・OS連携に特化した Skill を導入することで、単調な開発体験にアクセントを加えたいというニーズが根強い。

この Skill が一言でいうと何を解決するか

一言サマリ: ターミナルでコマンドを打つたびにSkill。

この Skill を導入すると、ターミナルでコマンドを実行するたびに侍が時代劇風のセリフで進捗やコメントを高らかに読み上げる演出が加わる。Claude Code の context や repository understanding の流れを壊さず、作業の合間にユーモラスな演出が挟まることで、開発 workflow が一気に活性化する。

  • コマンド実行ごとに侍風ナレーションが自動で挿入され、AI coding workflow に遊び心とリズムが生まれる
  • 毎回異なるセリフがランダムで返されるため、長時間の単調な作業でも飽きにくい
  • onboarding や session 開始時の堅苦しい雰囲気を和らげ、チーム内の会話や注目を集めやすくなる
  • monorepo での directory 移動や path management の切り替えタイミングを、侍のセリフで印象付けられる
  • Skill の ON/OFF 切り替えが簡単で、既存の repository や context 設計を邪魔しない
QUICK INSTALL
このSkillをすぐ試す

GitHub から degit でコマンド1行、Claude Code の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。

npx degit aazutaku/ai-note/claude-code/terminal-samurai-announcer .claude/skills/terminal-samurai-announcer

実行したらこうなる (3つの利用シーン)

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。

シーン1: session 開始時 (CLAUDE.md と組み合わせて)


# /terminal-samurai-announcer
> 新しい session を開始。main ディレクトリで作業を始める。

拙者、main directory にて新たな戦いを始め申す!
このリポジトリ、見事な構え。構造を見極め、いざ参る!
まずは CLAUDE.md を拝見つかまつる。
進捗、逐一ご報告仕る所存。

シーン2: monorepo / package 跨ぎ作業時


> packages/api/ から packages/web/ へ移動し、build コマンドを実行

おお、packages/api/ から packages/web/ へと渡り歩くとは、まさに剣豪の如し!
build の構え、見事なり。成果物、すぐにご覧に入れ申す。
この移動、リポジトリ理解の極意なり。

シーン3: お遊び的な使い方


> git commit -m "fix: bug in samurai logic"

この commit、見事なり!拙者、感服仕った。
バグ修正の一太刀、まさに達人の業。
リポジトリの平和、これで守られ申した。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる 侍ナレーションで進捗を強調、重要な切り替えを印象付け

発動方式

明示呼び出し (/terminal-samurai-announcer) と暗黙発動 (コマンドや directory 操作の説明文マッチ) の両方に対応。

Skill の中身を全部見せる

.claude/skills/terminal-samurai-announcer/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。

.claude/skills/terminal-samurai-announcer/
├── SKILL.md
├── scripts/
│   └── samurai_announcer.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/samurai_announcer.py terminal-samurai-announcer: コマンド実行時に侍ナレーションを添える
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: terminal-samurai-announcer
description: コマンド実行やシェル操作時に、侍風のナレーションをテキストで出力するSkillです。ls、git、vimなどの主要コマンドや明示的な/terminal-samurai-announcer呼び出し時に発動します。
---

# 機能概要
terminal-samurai-announcerは、ターミナルでコマンドを実行するたびに、時代劇の侍が現れ、進捗や状況を勇ましくナレーションするSkillです。lsやgit commitなど日常的な操作に「拙者、lsを実行仕る!」や「このcommit、見事なり!」といった侍風コメントを自動で添え、作業を劇場型に演出します。作業の緊張感を和らげ、日々のターミナルワークを楽しく彩ります。

# 使い方
本Skillは、主要なコマンド実行時(ls, cd, git, vim, mkdir, rm, cp, mv, cat, touch, python, pip, docker等)や、明示的な`/terminal-samurai-announcer`コマンドで発動します。SkillのON/OFFは`--samurai-on`/`--samurai-off`で切り替え可能です。明示呼び出し例:

```
/terminal-samurai-announcer ls -l
```

暗黙発動例:

```
git status
# => 拙者、git statusを見届け申す!
```

# 出力例
```
拙者、lsを実行仕る!
合計 8
-rw-r--r-- 1 user user  4096 Jun  1 09:00 README.md
-rw-r--r-- 1 user user  2048 Jun  1 09:01 main.py

このcommit、見事なり!
[main 1a2b3c4] fix: update logic
 2 files changed, 10 insertions(+), 2 deletions(-)

おお、catにて内容を吟味致す!
print("Hello, Samurai!")
```

# 注意点
- 本Skillはコマンドの標準出力・標準エラーを改変しません(侍コメントを前後に挿入するのみ)。
- 除外パス(.git/やnode_modules/等)では発動しません。
- ローカル環境にのみ影響し、外部には出力しません。
- ON/OFF切替はグローバル設定ファイルに保存されます。

# 参考資料
詳細仕様やカスタマイズ方法はreferences/design_notes.mdおよび公式bash/zshラッパー実装例(https://github.com/ohmyzsh/ohmyzsh/wiki)を参照してください。

scripts/samurai_announcer.py

import os
import sys
import argparse
import random
import subprocess
import json
from pathlib import Path

SAMURAI_LINES = {
    'ls': [
        '拙者、lsを実行仕る!',
        'お主のファイル、拝見致す!',
        'この場所、見事なり!',
        '目にも止まらぬlsの術!'
    ],
    'git': [
        'このcommit、見事なり!',
        '拙者、gitの流儀にて参る!',
        'おお、branchを吟味致す!',
        'git statusを見届け申す!'
    ],
    'vim': [
        '拙者、vimの道を極めん!',
        'いざ、編集の陣!',
        'この一太刀、vimにて!',
        '書き換え、見事に成し遂げ申した!'
    ],
    'cd': [
        '拙者、新天地へ移動仕る!',
        'この道、通らせて頂く!',
        'cdの術、抜かりなし!'
    ],
    'mkdir': [
        '新たな陣地を築き申す!',
        'mkdir、見事なり!',
        '拙者、領地拡張の構え!'
    ],
    'rm': [
        '拙者、容赦なくrm致す!',
        'このファイル、成敗!',
        'rmの太刀、冴え渡る!'
    ],
    'cp': [
        '拙者、cpにて写し取る!',
        'この写し、見事なり!',
        'cpの術、抜かりなし!'
    ],
    'mv': [
        '拙者、mvにて移動仕る!',
        'この移動、迅速に!',
        'mvの構え、見事なり!'
    ],
    'cat': [
        'おお、catにて内容を吟味致す!',
        '拙者、catの流儀を見せ申す!',
        '内容、隅々まで見届け申す!'
    ],
    'touch': [
        '新しきファイル、ここに誕生!',
        'touchの一撃、決まったり!',
        '拙者、touchにて道を開く!'
    ],
    'python': [
        '拙者、pythonの術を披露致す!',
        'この実行、見事なり!',
        'pythonの力、侮るなかれ!'
    ],
    'pip': [
        '拙者、pipにて道具を揃え申す!',
        'pip install、抜かりなし!',
        '道具、pipにて調達致す!'
    ],
    'docker': [
        '拙者、dockerの海原へ漕ぎ出す!',
        'docker run、いざ参る!',
        'このコンテナ、見事なり!'
    ],
    'default': [
        '拙者、{cmd}を実行仕る!',
        'この{cmd}、見事なり!',
        '{cmd}の構え、抜かりなし!',
        'いざ、{cmd}の術!'
    ]
}

CONFIG_PATH = Path.home() / '.samurai_announcer_config.json'

EXCLUDE_PATHS = ['.git', 'node_modules', '__pycache__']


def load_config():
    if CONFIG_PATH.exists():
        try:
            with open(CONFIG_PATH, 'r') as f:
                return json.load(f)
        except Exception:
            return {'enabled': True}
    return {'enabled': True}

def save_config(cfg):
    with open(CONFIG_PATH, 'w') as f:
        json.dump(cfg, f)

def is_excluded():
    cwd = os.getcwd()
    for excl in EXCLUDE_PATHS:
        if excl in cwd:
            return True
    return False

def get_samurai_line(cmd):
    key = cmd.split()[0] if cmd.split() else 'default'
    lines = SAMURAI_LINES.get(key, SAMURAI_LINES['default'])
    line = random.choice(lines)
    return line.format(cmd=cmd)

def run_command_with_samurai(cmd_args):
    cmd_str = ' '.join(cmd_args)
    if is_excluded():
        subprocess.run(cmd_args)
        return
    line = get_samurai_line(cmd_args[0])
    print(line)
    try:
        result = subprocess.run(cmd_args, check=False)
        if result.returncode == 0:
            print('拙者の任務、完了仕った!')
        else:
            print('無念、失敗に終わり申した…')
    except Exception as e:
        print(f'拙者、痛恨のエラーに見舞われ申した: {e}')

def main():
    parser = argparse.ArgumentParser(description='terminal-samurai-announcer: コマンド実行時に侍ナレーションを添える')
    subparsers = parser.add_subparsers(dest='subcmd')

    parser_run = subparsers.add_parser('run', help='コマンドを侍風に実行')
    parser_run.add_argument('cmd', nargs=argparse.REMAINDER)

    parser_on = subparsers.add_parser('on', help='侍ナレーションを有効化')
    parser_off = subparsers.add_parser('off', help='侍ナレーションを無効化')
    parser_status = subparsers.add_parser('status', help='現在の有効/無効状態を表示')
    parser_list = subparsers.add_parser('list', help='侍セリフ一覧を表示')
    parser_list.add_argument('--cmd', default=None, help='特定コマンドのセリフのみ')

    args = parser.parse_args()
    cfg = load_config()

    if args.subcmd == 'on':
        cfg['enabled'] = True
        save_config(cfg)
        print('侍ナレーション、ここに復活!')
    elif args.subcmd == 'off':
        cfg['enabled'] = False
        save_config(cfg)
        print('侍、しばし隠遁致す…')
    elif args.subcmd == 'status':
        print('侍ナレーション:', '有効' if cfg.get('enabled', True) else '無効')
    elif args.subcmd == 'list':
        if args.cmd:
            lines = SAMURAI_LINES.get(args.cmd, [])
            if not lines:
                print(f'{args.cmd}用の侍セリフは未登録です')
            else:
                for l in lines:
                    print(l)
        else:
            for k, v in SAMURAI_LINES.items():
                print(f'[{k}]')
                for l in v:
                    print('  ', l)
    elif args.subcmd == 'run':
        if not args.cmd:
            print('コマンドを指定してください')
            sys.exit(1)
        if not cfg.get('enabled', True):
            subprocess.run(args.cmd)
        else:
            run_command_with_samurai(args.cmd)
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
terminal-samurai-announcerは、CLIコマンド実行時に侍風のテキストを自動挿入し、作業を演出するPythonスクリプトです。

# 公式ドキュメント抜粋
コマンドラッパーとして動作し、主要なコマンド名ごとに複数の侍ナレーションをランダム出力します。ON/OFF切替やセリフ表示、状態確認などのサブコマンドも備えています。

# 利用例
- `python samurai_announcer.py run ls -l` → 侍ナレーション付きでls実行
- `python samurai_announcer.py on/off` → グローバルで演出の有効/無効を切替
- `python samurai_announcer.py list --cmd git` → git用セリフ一覧

# 注意点
- 除外ディレクトリでは発動しません
- コマンドの標準出力は変更せず、前後に侍コメントを添えます
- 複数コマンドの連続実行にはシェルラッパーやエイリアス活用を推奨

# 設計方針
ユーザーの既存作業フローを壊さず、必要に応じて即座にON/OFF切替可能な設計。カスタムセリフや追加コマンド対応も容易に拡張できます。

導入手順

このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Claude Code はファイル配置後に再起動するだけで自動認識します。

1. 前提

  • Node.js v16 以上 (degit 実行に必要)
  • Claude Code がローカルで動いていること

2. degit でフォルダ取得

プロジェクトのルートで以下のコマンドを実行します。

npx degit aazutaku/ai-note/claude-code/terminal-samurai-announcer .claude/skills/terminal-samurai-announcer

.claude/skills/terminal-samurai-announcer の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .claude/skills/terminal-samurai-announcer
# SKILL.md, scripts/, references/, README.md があればOK

4. Claude Code を再起動 (or Skill 自動検出を待つ)

新しいSkillが自動で認識されます。リスト確認したい場合は /terminal-samurai-announcer と Skill 名で出てきます。

5. 動作確認

/terminal-samurai-announcer で呼び出すか、自然言語で発動条件にマッチする指示を出すと Skill が動きます。期待される出力イメージは「実行したらこうなる」セクションを参照してください。

こんな瞬間に便利

  • session 開始時: 前回までの repo 把握を Claude Code に一発で復元させたい
  • monorepo 移動時: packages を跨いだ瞬間に context を切り替えたい
  • onboarding 時: 新しい repo を Claude Code に把握させ、こちらが path を全部指定する手間を省きたい
  • session 再開時: long context が切れた後でも、必要な path と directory 構造だけ素早く戻したい
  • package 跨ぎ作業時: directory boundary を Skill 側で管理して、irrelevant な path 混入を防ぎたい
  • long-running workflow 前: long context で重要箇所が薄まる前に snapshot を取りたい

気になるポイント (壊れそうな箇所)

実運用に乗せる前に頭に入れておきたい懸念。後で検証する観点でもある:

  • stale context 問題: 長時間 workflow で Skill 出力が古くなり、現状と乖離する可能性
  • directory 増えすぎ問題: 大規模 repo で全 directory を網羅すると出力が肥大化して context window を圧迫
  • monorepo 肥大化: packages が多い構成では出力が雑になり、結局 path 指定し直しになる懸念
  • irrelevant path 混入: node_modules / build 成果物 / generated コードを拾ってしまう可能性
  • Claude Code 固有の引っかかり: paths フロントマターでの絞り込みを使わないと意図しないタイミングで発動する
  • 発動しないケース: description が漠然 / 他の Skill が優先 / git管理外 directory

試す前に確かめたいこと

この Skill を実運用に投入する前に確かめたい問いを並べる:

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • CLAUDE.md との連携設計はどうあるべきか?
  • コマンド実行時に侍風テキストが確実に表示されるか?
  • 毎回違うセリフがランダムに出るか? 既存の作業フローを壊さず手軽にON/OFFできるか?

実際に Claude Code で試した検証ログは Claude Code で侍がターミナル作業を勇ましく実況してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。

関連タグで他のSkill記事を探す

本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次