Codexでターミナル操作を侍風に演出する使いこなし術

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

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

AIコーディング支援環境である Codex を使っていると、ターミナル操作やリポジトリの切り替え時に「ちょっとした演出や通知が欲しい」と感じる瞬間が少なくありません。特に長時間作業や複数のディレクトリを跨ぐ monorepo 開発では、淡々としたコマンド実行の繰り返しが続き、気分転換や集中力維持が課題となりがちです。また、Codex 固有の挙動として context や path 管理の煩雑さもユーザーの悩みにつながります。

  • Codex が context を見失って違う場所のコードを参照する
  • monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
  • session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
  • 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
  • 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる

加えて、日々のターミナル作業が単調になりがちで、進捗や区切りを可視化する通知や、ちょっとした遊び心が欲しいと感じることも多いはずです。特に「通知・演出・OS連携」カテゴリの Skill を求めるユーザーにとって、作業の合間に気持ちを切り替えられる演出は、意外と重要なモチベーション維持要素となります。

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

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

この Skill を導入すると、ターミナルでコマンドを実行するたびに、時代劇風の侍ナレーションが進捗や操作内容を高らかに読み上げてくれます。具体的なメリットとしては以下の通りです。

  • 作業の進捗や directory 移動、commit などの重要操作を侍風に通知し、長時間の AI coding workflow でも集中力やモチベーションを維持しやすくなる
  • monorepo や複雑な repository 構造でも、context や path management の切り替えを侍ナレーションで可視化でき、repository understanding の助けになる
  • session 再開時や onboarding 時に、侍の演出で「今どの directory で何をするのか」を明確に伝え、memory や context の再構築を楽しくサポート
  • 毎回異なるセリフがランダムで出るため、単調な作業にも遊び心をプラスできる
  • Skill の ON/OFF が手軽で既存 workflow を壊さず導入できる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/codex/terminal-samurai-announcer .agents/skills/terminal-samurai-announcer

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

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。

シーン1: session 開始時 (プロジェクト初動で)


# /skills menu or terminal-samurai-announcer mention
> cd my-awesome-repo

拙者、my-awesome-repo に参上仕る!
ここより新たな開発の道、切り拓く所存。
リポジトリの構造、隅々まで見通し候。
いざ、context を整え、御命令を待つ!

> ls

拙者、ls を実行仕る!
目に映るは、src、tests、README.md なり。
これぞ、開発の要にござる。

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


> cd packages/core

拙者、packages/core へと移動致す!
この地は monorepo の要、core package なり。
context を新たに、repository understanding を深め申す。

> git commit -m "Add core logic"

この commit、見事なり!
拙者、己が刀で history に刻み入れ申した。
path management も怠りなく、次なる directory へ進軍致す!

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


> rm -rf node_modules

拙者、node_modules を一刀両断!
余計なものは全て斬り捨て御免に候。
これぞ、軽き repository への第一歩!

> echo "侍最高!"

拙者、侍最高!との御言葉、しかと承った!
この一声、開発の士気を高めるでござる。

before / after の違い

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

発動方式

明示呼び出し (/skills menu or terminal-samurai-announcer mention) と、コマンド説明にマッチした際の暗黙発動(semantic-or-explicit)の両方に対応しています。

Skill の中身を全部見せる

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

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

各ファイルの役割

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

SKILL.md

---
name: terminal-samurai-announcer
description: ターミナルでコマンド実行時や /skills menu で明示的に呼び出された際、侍風の時代劇ナレーションを毎回ランダムに挿入し、進捗や作業内容を勇ましく実況するSkill。コマンド実行・進捗・通知などのキーワードを含む操作時に発動。
---

# 機能概要
terminal-samurai-announcerは、ターミナルでコマンドを実行するたびに、侍が現れて時代劇風に作業内容や進捗を高らかに実況します。lsやgit、ビルドコマンドなど、普段の作業が一気にチャンバラ劇場に早変わり。毎回ランダムな侍ナレーションが表示され、作業の緊張感を和らげ、周囲の注目も集められる演出系Skillです。既存の作業フローを壊さず、ON/OFFも手軽に切り替え可能です。

# 使い方
- 明示呼び出し例: `/skills menu` から「terminal-samurai-announcer」をONにする、または `$terminal-samurai-announcer` をmention
- 暗黙発動キーワード例: 「コマンド実行」「進捗」「通知」「ls」「git」「build」などの操作時に自動発動

# 出力例
```
拙者、lsの構えにて候!
このcommit、見事なり!
お主、buildを成し遂げ申した!
拙者、rmの術を使い申す!
これぞpush、まさに一世一代の大勝負!
そなたのpull、鮮やかなる手並み!
```

# 注意点
- 本Skillは標準出力に侍風メッセージを挿入しますが、コマンドの実際の出力や挙動には影響しません。
- ローカルの履歴やファイルを変更しません。
- ON/OFFはSkillメニューや明示コマンドで切り替え可能です。
- 一部の特殊なコマンドやパイプ処理には対応しない場合があります。

# 参考資料
詳細な設計方針・利用例は `references/design_notes.md` を参照。時代劇ナレーションの生成はPythonの標準randomモジュールを活用。公式ドキュメント: https://docs.python.org/ja/3/library/random.html

scripts/samurai_announcer.py

import argparse
import subprocess
import random
import sys
import os
from typing import List

SAMURAI_PHRASES = [
    "拙者、{cmd}の構えにて候!",
    "これぞ{cmd}、まさに一世一代の大勝負!",
    "お主、{cmd}を成し遂げ申した!",
    "この{cmd}、見事なり!",
    "拙者、{cmd}の術を使い申す!",
    "そなたの{cmd}、鮮やかなる手並み!",
    "{cmd}、いざ参る!",
    "{cmd}、これぞ侍の嗜み!",
    "{cmd}の極意、今ここに!",
    "お見事、{cmd}の業!"
]

ON_OFF_FILE = os.path.expanduser("~/.samurai_announcer_on")


def is_enabled() -> bool:
    return os.path.exists(ON_OFF_FILE)


def enable():
    with open(ON_OFF_FILE, 'w') as f:
        f.write('on')
    print("terminal-samurai-announcer: ON")


def disable():
    if os.path.exists(ON_OFF_FILE):
        os.remove(ON_OFF_FILE)
    print("terminal-samurai-announcer: OFF")


def print_samurai_phrase(cmd: str):
    phrase = random.choice(SAMURAI_PHRASES)
    print(phrase.format(cmd=cmd))


def run_command(command: List[str]):
    cmd_str = ' '.join(command)
    print_samurai_phrase(cmd_str)
    try:
        result = subprocess.run(command, check=False)
        sys.exit(result.returncode)
    except FileNotFoundError:
        print(f"コマンドが見つかりませぬ: {command[0]}")
        sys.exit(127)
    except Exception as e:
        print(f"拙者、思わぬ事態にござる: {e}")
        sys.exit(1)


def list_phrases():
    print("-- 侍ナレーション一覧 --")
    for p in SAMURAI_PHRASES:
        print(p.format(cmd="<コマンド>"))


def main():
    parser = argparse.ArgumentParser(
        description="ターミナル侍ナレーター: コマンド実行時に侍風実況を挿入するスキル。"
    )
    subparsers = parser.add_subparsers(dest='subcmd')

    parser_on = subparsers.add_parser('on', help='侍ナレーターを有効化')
    parser_off = subparsers.add_parser('off', help='侍ナレーターを無効化')
    parser_list = subparsers.add_parser('list', help='侍ナレーション例を表示')
    parser_run = subparsers.add_parser('run', help='コマンドを侍実況付きで実行')
    parser_run.add_argument('command', nargs=argparse.REMAINDER, help='実行するコマンド')

    args = parser.parse_args()

    if args.subcmd == 'on':
        enable()
    elif args.subcmd == 'off':
        disable()
    elif args.subcmd == 'list':
        list_phrases()
    elif args.subcmd == 'run':
        if not args.command:
            print("実行するコマンドを指定してくだされ!")
            sys.exit(2)
        run_command(args.command)
    else:
        # 暗黙モード: ONならラップして実行
        if is_enabled():
            if len(sys.argv) > 1:
                run_command(sys.argv[1:])
            else:
                parser.print_help()
        else:
            parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
terminal-samurai-announcerは、日々のターミナル作業を時代劇風に実況することで、作業の緊張感を和らげ、楽しい演出を提供するSkillです。コマンド実行時に標準出力へ侍風メッセージを毎回ランダムに挿入します。

# 公式ドキュメント抜粋
本SkillはPython標準のrandom, subprocess, argparseモジュールのみを利用し、外部依存なく動作します。ON/OFF状態はユーザーホームディレクトリの隠しファイルで管理します。

# 利用例
- `python samurai_announcer.py on` で有効化
- `python samurai_announcer.py run ls -l` で実況付きls
- ON状態で `python samurai_announcer.py git status` など任意コマンドをラップ実行

# 注意点
コマンドの実際の出力や挙動には干渉せず、標準出力にメッセージを追加するだけです。パイプや複雑なシェル構文には未対応。

# 設計方針
SkillのON/OFF切替は明示的に可能とし、既存作業フローの邪魔をしません。実況文はテンプレート+コマンド名を埋め込む方式で多様性を確保しています。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/codex/terminal-samurai-announcer .agents/skills/terminal-samurai-announcer

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

3. ファイル配置確認

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

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

新しいSkillが自動で認識されます。リスト確認したい場合は /skills menu or $skill-name mention と Skill 名で出てきます。

5. 動作確認

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

こんな瞬間に便利

  • session 開始時: 前回までの repo 把握を Codex に一発で復元させたい
  • monorepo 移動時: packages を跨いだ瞬間に context を切り替えたい
  • onboarding 時: 新しい repo を Codex に把握させ、こちらが 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 コードを拾ってしまう可能性
  • Codex 固有の引っかかり: description のセマンティックマッチ精度が要件次第
  • 発動しないケース: description が漠然 / 他の Skill が優先 / git管理外 directory

試す前に確かめたいこと

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

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

実際に Codex で試した検証ログは Codexで侍がターミナルを盛り上げる演出を試してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

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

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

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

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