Codexでターミナル作業気分を斬り捨て御免で楽しく可視化する方法

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

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

Codex を日々使い込む中で、ちょっとした「間」が生まれる瞬間は誰しも経験がある。ターミナルを開いた直後、作業前の緊張感や、これから始まる長丁場のワークフローに向けて気持ちを切り替えたいタイミング。しかし、現実は淡々としたプロンプトだけが待ち受けているのが常だ。

また、通知や演出系 Skill を使いたいと思っても、実用一辺倒で味気ないものが多く、遊び心やちょっとした“間”を演出するものは意外と見当たらない。特に以下のような悩みが挙げられる:

  • ターミナルを開くたびに、毎回同じ無機質なプロンプトで始まり、作業気分の切り替えが難しい
  • 長時間作業や monorepo の複雑な repo で、Codex の context が stale になり、集中力が途切れがち
  • onboarding 時や session 再開時、気分転換やモチベーションアップにつながる演出が欲しい
  • 通知・演出系 Skill を入れても、すぐに飽きてしまい、記憶にも残らない
  • 気軽に“遊び”を取り入れつつ、AI coding workflow の流れを壊さない演出を探している

Codex の context や repo 理解をサポートしつつ、日々の開発体験にちょっとした楽しさをプラスしたい──そんな悩みを感じたことがあるユーザーは多いはずだ。

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

一言サマリ: ターミナルを開くたびSkill。

このSkillを導入すれば、ターミナルを開くたびに“侍”が現れ、その日の作業気分を天気予報風に斬り捨て御免してくれる。現実の天気やAPIには一切依存せず、完全ランダムなコメントで、毎回違った気分転換を提供する。

  • 作業開始時に侍の一言で気持ちをリセットし、AI coding workflow の切り替えがスムーズになる
  • repo や directory の context 切り替え時にも、遊び心ある演出で集中力を保てる
  • onboarding や session 再開時の“間”に、記憶に残る体験を加えることで、Codex の利用が楽しくなる
  • monorepo での package 跨ぎや長時間作業の合間に、ちょっとした会話のきっかけやリフレッシュを提供
  • Skill の出力が毎回変わるため、飽きずに継続利用できる
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


# /skills menu or terminal-samurai-weathercaster mention
> ターミナルを開く

侍: 本日快晴、コードも冴え渡るでござる!
侍: この repo の構造、まるっと見通し良好。
侍: 迷いなき path で、いざ開発の道へ進むべし!

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


> cd packages/api

侍: 曇りのち晴れ、package 跨ぎの道中にて。
侍: api ディレクトリ、未知の地形現るも恐れることなかれ。
侍: 斬り捨て御免、context の迷いも一刀両断!

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


> ターミナルを再起動

侍: 雷注意報、バグの嵐到来か?
侍: 本日も平常心を忘れず、冷静にデバッグするでござる。
侍: いざ、リポジトリの闇に挑むべし!

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し 侍の一言で context 切り替えと気分転換が同時にできる
monorepo 移動 違う package のコードを参照しがち 侍が directory 跨ぎを演出、注意喚起にもなる
長時間 workflow long context で重要箇所が薄まる 合間の侍コメントで集中力をリセットできる

発動方式

明示呼び出し (/skills menu or terminal-samurai-weathercaster mention) と、ターミナル起動時などの暗黙発動(description マッチ)の両方に対応。

Skill の中身を全部見せる

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

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

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/samurai_weathercaster.py Terminal Samurai Weathercaster: 侍が気分で天気予報を斬り捨てる演出スクリプト
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: terminal-samurai-weathercaster
description: ターミナル起動時や /skills menu、terminal-samurai-weathercaster の明示呼び出し時に発動。天気APIや現実の天候参照は一切せず、毎回異なる侍風コメントをランダム生成し、作業開始気分を演出する際に利用。
---

# 機能概要
terminal-samurai-weathercasterは、ターミナルを開くたびに“侍”が登場し、その日の作業気分を天気予報風に斬り捨て御免する演出系Skillです。現実の天気やAPI参照は一切行わず、完全にランダムな天気・侍コメントを生成。作業開始の緊張感やマンネリを和らげ、開発現場にユーモアと意外性をもたらします。

# 使い方
- 明示呼び出し: `/skills menu` から本Skillを選択、または `terminal-samurai-weathercaster` を直接呼び出し
- 暗黙発動: ターミナル起動時、または「天気」「侍」「気分」「演出」などのキーワードを含む状況で自動発動

# 出力例
```
【侍の気分天気予報】
本日快晴、コードも冴え渡るでござる!
------------------------------
侍より一言: 「エラーも恐れず、進むがよい!」

【侍の気分天気予報】
雷注意報、バグの嵐到来か?
------------------------------
侍より一言: 「バグ斬り捨て御免!」
```

# 注意点
- 現実の天気やAPI参照は一切行いません
- 出力は毎回完全ランダムです
- ローカル環境での利用を前提とし、外部サーバー等へのデータ送信はありません
- 侍コメントはジョーク要素を含みますが、業務利用時はご注意ください

# 参考資料
- references/design_notes.md を参照
- 公式: [Python random](https://docs.python.org/ja/3/library/random.html), [argparse](https://docs.python.org/ja/3/library/argparse.html)

scripts/samurai_weathercaster.py

import random
import argparse
import sys
from datetime import datetime

# 天気と侍コメントの候補リスト
def get_weather_messages():
    return [
        "本日快晴、コードも冴え渡るでござる!",
        "曇り空、集中力を切らさぬように…",
        "雨模様、バグの気配漂うでござる",
        "雷注意報、バグの嵐到来か?",
        "強風注意、仕様変更が吹き荒れる!",
        "小春日和、穏やかな開発日和でござる",
        "猛暑日、熱き情熱で乗り切る所存!",
        "雪化粧、静かにコードを積み重ねるでござる",
        "霧深し、要件が見えぬ…慎重に参ろう",
        "台風接近、デプロイは控えるが吉!"
    ]

def get_samurai_comments():
    return [
        "エラーも恐れず、進むがよい!",
        "バグ斬り捨て御免!",
        "仕様書は心の目で読むものなり",
        "コミットは一日一善",
        "レビューは手加減無用!",
        "集中力、切らすなよ",
        "今日も一日、よろしく頼む",
        "油断大敵、慢心は禁物",
        "時には休息も大切でござる",
        "デバッグこそ武士の道"
    ]

# 出力生成
def generate_forecast():
    weather = random.choice(get_weather_messages())
    comment = random.choice(get_samurai_comments())
    now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    lines = [
        "【侍の気分天気予報】",
        f"{weather}",
        "------------------------------",
        f"侍より一言: 「{comment}」",
        f"({now})"
    ]
    return "\n".join(lines)

# ログ保存
def save_log(message, logfile="samurai_weather.log"):
    try:
        with open(logfile, 'a', encoding='utf-8') as f:
            f.write(message + '\n')
    except Exception as e:
        print(f"[ERROR] ログ保存失敗: {e}", file=sys.stderr)

# ログ一覧
def list_logs(logfile="samurai_weather.log", count=10):
    try:
        with open(logfile, 'r', encoding='utf-8') as f:
            lines = f.readlines()
        print(f"=== 直近{count}件の侍天気ログ ===")
        for line in lines[-count:]:
            print(line.strip())
    except FileNotFoundError:
        print("ログファイルが見つかりません。まだ一度も発動していない可能性があります。")
    except Exception as e:
        print(f"[ERROR] ログ読み込み失敗: {e}", file=sys.stderr)

# サマリー表示
def show_summary(logfile="samurai_weather.log"):
    try:
        with open(logfile, 'r', encoding='utf-8') as f:
            logs = f.read().split('【侍の気分天気予報】')
        logs = [l for l in logs if l.strip()]
        print(f"=== 侍天気予報 発動回数: {len(logs)}回 ===")
        weather_count = {}
        for l in logs:
            for w in get_weather_messages():
                if w in l:
                    weather_count[w] = weather_count.get(w, 0) + 1
        for w, c in sorted(weather_count.items(), key=lambda x: -x[1]):
            print(f"{w}: {c}回")
    except FileNotFoundError:
        print("ログファイルが見つかりません。まだ一度も発動していない可能性があります。")
    except Exception as e:
        print(f"[ERROR] サマリー取得失敗: {e}", file=sys.stderr)

# コマンドライン引数処理
def main():
    parser = argparse.ArgumentParser(description="Terminal Samurai Weathercaster: 侍が気分で天気予報を斬り捨てる演出スクリプト")
    subparsers = parser.add_subparsers(dest="command")

    # log: 新規発動
    log_parser = subparsers.add_parser("log", help="侍天気予報を発動し、ログに記録")
    # list: ログ表示
    list_parser = subparsers.add_parser("list", help="ログ一覧を表示")
    list_parser.add_argument("-n", "--count", type=int, default=10, help="表示件数 (デフォルト10件)")
    # summary: サマリー
    summary_parser = subparsers.add_parser("summary", help="発動回数や天気ごとの集計を表示")

    args = parser.parse_args()
    logfile = "samurai_weather.log"
    if args.command == "log" or args.command is None:
        message = generate_forecast()
        print(message)
        save_log(message, logfile=logfile)
    elif args.command == "list":
        list_logs(logfile=logfile, count=args.count)
    elif args.command == "summary":
        show_summary(logfile=logfile)
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
terminal-samurai-weathercasterは、ターミナル起動時や明示呼び出しで、現実の天気やAPI参照を一切行わず、完全ランダムな侍風天気コメントを生成・表示するSkillです。作業開始時の演出や気分転換を主目的としています。

# 公式ドキュメント抜粋
- [Python random](https://docs.python.org/ja/3/library/random.html): ランダムな天気・コメント選択に利用
- [argparse](https://docs.python.org/ja/3/library/argparse.html): CLIサブコマンド・引数処理に利用

# 利用例
- ターミナルを開くたびに自動で侍コメントが表示され、開発現場の雰囲気を和ませる
- 明示的に `python samurai_weathercaster.py log` で発動履歴を記録
- `list` サブコマンドで過去の侍コメントを確認
- `summary` で発動傾向を分析

# 注意点
- 現実の天気や位置情報は一切利用しません
- 出力内容は完全にランダムです
- ログはローカルファイル (samurai_weather.log) のみ保存

# 設計方針
- シンプルなPythonスクリプトでOS・環境依存性を最小化
- ユーモアと演出性を重視し、実用性よりも体験価値を優先

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

ls .agents/skills/terminal-samurai-weathercaster
# 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 との連携設計はどうあるべきか?
  • ターミナル起動時に必ず侍コメントが出るか?
  • 天気や侍台詞が毎回ランダムで変わるか?
  • 現実の天気やAPI参照が一切ないことが担保されているか?

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

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

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

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

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