Codex ユーザーが日常でぶつかる悩み
AI coding workflow に慣れてくると、日々のコミットやリポジトリ管理がどんどん機械的になり、ちょっとした“間”や遊び心が欲しくなる瞬間がある。特に monorepo での作業や、長時間の session では、作業が単調に感じられたり、デプロイ前の緊張感が高まったりしがちだ。その一方で、Codex の context 管理や repository understanding のクセにより、以下のような「あるある」な悩みも日常的に発生する。
- コミット作業が単調で、リポジトリや directory を跨いだ workflow に変化がなく、気が抜けがち
- monorepo で packages を跨ぐたびに、Codex の repository understanding がリセットされる違和感
- 長時間作業で long context が膨らみ、重要な path management や memory がぼやけてくる
- session 再開時、前回の context の雰囲気や緊張感が一切残っていないので、気持ちの切り替えがしづらい
- 「このコミットは本当に良かったのか?」と自問自答しつつも、何も起こらず淡々と進行してしまう
こうした日常の“隙間”に、ちょっとした遊びやカオス要素が欲しいと感じたことはないだろうか。
この Skill が一言でいうと何を解決するか
一言サマリ: コミットするたびにSkill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- コミットのたびにターミナルにタロット風の占いが表示され、単調なAI coding workflowに笑いと混乱が生まれる
- session 開始や repository 移動など、context 切り替えの瞬間に一息つける遊び要素が加わる
- monorepo や大規模 directory 構造でも、コミットごとに“運命”を占うことで気持ちをリセットできる
- onboarding や長時間作業の合間に、冗談やネタで緊張感を和らげることができる
- Codex の context や path management の流れに、あえてノイズを入れることで新鮮な気分転換ができる
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/commit-fortune-teller .agents/skills/commit-fortune-teller実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu
> commit-fortune-teller
[Codex] 本日のあなたのコミット運
────────────────────────────
「愚者」:新しい旅立ち。大胆に進め!
今日の開発は思い切った refactor が吉。
────────────────────────────
リポジトリ: /my-monorepo
パッケージ: packages/core
────────────────────────────
シーン2: monorepo / package 跨ぎ作業時
> git commit -m "fix: update user handler"
[Codex] コミット運勢
────────────────────────────
「死神」:古いコードとの決別。破壊と再生の時。
このコミットが未来を変えるかも?
────────────────────────────
対象ディレクトリ: packages/api/
────────────────────────────
シーン3: お遊び的な使い方
> /commit-fortune-teller
[Codex] あなたの今日の運勢は…
────────────────────────────
「大吉」:何をやっても成功する日!
PRレビューも一発通過の予感。
────────────────────────────
おみくじ番号: #47
────────────────────────────
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Codex が自動で context を復元、最小プロンプトで再開 |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識して必要な範囲だけ見る |
| 長時間 workflow | long context で重要箇所が薄まる | コミットごとに気分転換、集中力が維持しやすい |
発動方式
明示呼び出し (/skills menu or $skill-name mention) と暗黙発動 (description マッチ) の両方に対応。
Skill の中身を全部見せる
.agents/skills/commit-fortune-teller/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/commit-fortune-teller/
├── SKILL.md
├── scripts/
│ └── commit_fortune_teller.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/commit_fortune_teller.py |
コミット占い: commit-fortune-teller |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: commit-fortune-teller
description: コミット時や/skills menu、commit-fortune-tellerの明示呼び出し時に発動。commit、push、fortune、運勢、占い、タロット等のキーワードやgit操作直後に反応。
---
# 機能概要
commit-fortune-tellerは、Gitコミットのたびにターミナルへランダムな“タロット風占い結果”を表示するジョーク系Skillです。作業の緊張感や重苦しさを和らげ、エンジニアの運命をコードではなく運に委ねるカオスな世界観を提供します。実用性はありませんが、日々の開発に笑いや話題をもたらします。
# 使い方
- 明示呼び出し例: `/skills menu` で選択、または `commit-fortune-teller` を直接指定
- 暗黙発動キーワード例: `commit`, `push`, `fortune`, `運勢`, `占い`, `タロット`, `git` などの操作直後
# 出力例
```
=== Commit Fortune Teller ===
今日の運勢: 大吉
このコミットは「太陽」…成功と喜びの暗示!
アドバイス: 迷わず進め、道は開かれる。
-----------------------------
=== Commit Fortune Teller ===
今日の運勢: 凶
このコミットは「塔」…思わぬバグに注意!
アドバイス: テストを怠るべからず。
-----------------------------
```
# 注意点
- 本SkillはGit操作の直後にのみ発動し、実際のコミット内容や履歴には影響しません。
- 出力は完全にランダムで、実際の運勢や成果とは無関係です。
- ローカル環境にログ等は保存されません。
- ジョーク用途のため、業務利用や真剣な判断には不向きです。
# 参考資料
- [Python random — 公式ドキュメント](https://docs.python.org/ja/3/library/random.html)
- references/design_notes.md も参照
scripts/commit_fortune_teller.py
import argparse
import random
import sys
from datetime import datetime
tarot_cards = [
{"name": "愚者", "meaning": "新しい始まり、自由、冒険"},
{"name": "魔術師", "meaning": "創造力、意志、始動"},
{"name": "女教皇", "meaning": "直感、神秘、知恵"},
{"name": "女帝", "meaning": "豊かさ、成長、母性"},
{"name": "皇帝", "meaning": "安定、権力、統制"},
{"name": "法王", "meaning": "伝統、助言、信頼"},
{"name": "恋人", "meaning": "選択、調和、愛"},
{"name": "戦車", "meaning": "勝利、意志、前進"},
{"name": "力", "meaning": "勇気、忍耐、強さ"},
{"name": "隠者", "meaning": "内省、探求、孤独"},
{"name": "運命の輪", "meaning": "転機、幸運、変化"},
{"name": "正義", "meaning": "公平、バランス、責任"},
{"name": "吊るされた男", "meaning": "忍耐、犠牲、視点の転換"},
{"name": "死神", "meaning": "終わりと始まり、変容"},
{"name": "節制", "meaning": "調和、節度、癒し"},
{"name": "悪魔", "meaning": "誘惑、束縛、執着"},
{"name": "塔", "meaning": "崩壊、衝撃、変革"},
{"name": "星", "meaning": "希望、癒し、インスピレーション"},
{"name": "月", "meaning": "不安、幻想、直感"},
{"name": "太陽", "meaning": "成功、喜び、活力"},
{"name": "審判", "meaning": "再生、覚醒、決断"},
{"name": "世界", "meaning": "達成、完成、統合"}
]
fortunes = [
{"label": "大吉", "advice": "迷わず進め、道は開かれる。"},
{"label": "中吉", "advice": "小さな成功を大切に。"},
{"label": "小吉", "advice": "焦らず一歩ずつ。"},
{"label": "吉", "advice": "周囲との協力がカギ。"},
{"label": "末吉", "advice": "油断せず堅実に。"},
{"label": "凶", "advice": "テストを怠るべからず。"},
{"label": "大凶", "advice": "今日は無理せず休もう。"}
]
advice_pool = [
"レビューは慎重に。",
"コミットメッセージに魂を込めよ。",
"バグは思わぬ所に潜む。",
"深夜のコミットは控えめに。",
"リファクタリングは明日でも遅くない。",
"デプロイ前に深呼吸。",
"運も実力のうち。",
"新しいブランチで冒険を。"
]
def print_fortune():
fortune = random.choice(fortunes)
card = random.choice(tarot_cards)
advice = fortune["advice"]
# 追加で遊び心あるアドバイスを混ぜる
if random.random() < 0.5:
advice += " " + random.choice(advice_pool)
print("=== Commit Fortune Teller ===")
print(f"今日の運勢: {fortune['label']}")
print(f"このコミットは「{card['name']}」…{card['meaning']}の暗示!")
print(f"アドバイス: {advice}")
print("-----------------------------\n")
def log_fortune(logfile):
fortune = random.choice(fortunes)
card = random.choice(tarot_cards)
advice = fortune["advice"]
if random.random() < 0.5:
advice += " " + random.choice(advice_pool)
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open(logfile, "a", encoding="utf-8") as f:
f.write(f"[{now}] 運勢: {fortune['label']} | カード: {card['name']} ({card['meaning']}) | アドバイス: {advice}\n")
print(f"ログに記録しました: {logfile}")
def list_log(logfile, n):
try:
with open(logfile, "r", encoding="utf-8") as f:
lines = f.readlines()
for line in lines[-n:]:
print(line.strip())
except FileNotFoundError:
print(f"ログファイルが見つかりません: {logfile}")
def summary_log(logfile):
try:
with open(logfile, "r", encoding="utf-8") as f:
lines = f.readlines()
total = len(lines)
counts = {k['label']: 0 for k in fortunes}
for line in lines:
for label in counts.keys():
if f"運勢: {label}" in line:
counts[label] += 1
print(f"=== Fortune Summary ({total}件) ===")
for k, v in counts.items():
print(f"{k}: {v}回")
except FileNotFoundError:
print(f"ログファイルが見つかりません: {logfile}")
def main():
parser = argparse.ArgumentParser(description="コミット占い: commit-fortune-teller")
subparsers = parser.add_subparsers(dest="command")
parser_log = subparsers.add_parser("log", help="占い結果をログファイルに記録")
parser_log.add_argument("--file", default=".commit_fortune.log", help="ログファイル名")
parser_list = subparsers.add_parser("list", help="ログの最新N件を表示")
parser_list.add_argument("--file", default=".commit_fortune.log", help="ログファイル名")
parser_list.add_argument("-n", type=int, default=5, help="表示件数")
parser_summary = subparsers.add_parser("summary", help="ログのサマリー統計を表示")
parser_summary.add_argument("--file", default=".commit_fortune.log", help="ログファイル名")
parser_fortune = subparsers.add_parser("fortune", help="占い結果を表示 (デフォルト)")
args = parser.parse_args()
if args.command == "log":
log_fortune(args.file)
elif args.command == "list":
list_log(args.file, args.n)
elif args.command == "summary":
summary_log(args.file)
else:
print_fortune()
if __name__ == "__main__":
main()
references/design_notes.md
# 概要
commit-fortune-tellerは、Gitコミットやpushのタイミングでターミナルにランダムな“運勢”を表示するジョークSkillです。エンジニアの作業に笑いや話題を提供し、重苦しい開発現場の空気を和らげることを目的としています。
# 公式ドキュメント抜粋
- Python randomモジュール: https://docs.python.org/ja/3/library/random.html
- argparse: https://docs.python.org/ja/3/library/argparse.html
# 利用例
- 毎回のコミット時に自動発動し、その日の運勢やタロットカードが表示される
- `/skills menu`や明示的な呼び出しで任意のタイミングでも実行可能
- ログ機能で過去の運勢を振り返ることもできる
# 注意点
- 実際のGitリポジトリや履歴には一切影響しません
- 出力内容は完全にランダムで、現実の運勢や成果とは無関係です
- ログファイルはローカルにのみ保存され、外部送信等はありません
# 設計方針
- 軽量かつ邪魔になりすぎない実装
- 占い文面やカードの意味に遊び心を盛り込む
- 実用性よりも“混乱と笑い”を重視
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/commit-fortune-teller .agents/skills/commit-fortune-teller
.agents/skills/commit-fortune-teller の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/commit-fortune-teller
# 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 との連携設計はどうあるべきか?
- 占いメッセージがちゃんとランダムで表示されるか?
- コミット時の割り込み動作が軽量で邪魔になりすぎないか?
- 運勢の種類や文面に遊び心があるか?
実際に Codex で試した検証ログは Codexのコミット占いで運勢を楽しみながらコミットしてみた にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
