Codexで作業中に非日常感を演出する通知演出活用ガイド

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

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

集中してAIコーディングを進めていると、作業空間が単調になりがちです。特にCodexのようなAI coding workflowでは、システムからの通知や演出がほとんどなく、没頭しすぎて疲労やストレスが溜まりやすいという声もよく聞きます。また、以下のような悩みも多く挙げられます。

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

こうした状況では、作業のリズムを意図的に崩してリフレッシュしたい瞬間があっても、Codex からの自然な「気分転換」や通知演出枠がほとんど存在しません。特にリモートワークや長時間の開発セッションでは、ちょっとした非日常体験や遊び心が欲しくなるものです。

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

一言サマリ: このスキルは、Codex の作業空間に突発的な“低重力OS通知”をランダム演出として挟み込み、集中力を一瞬リセットするSkill。

もう少し具体化すると、このSkillを入れることで以下のような状態になる:

  • 単調なAI coding workflow中に、思考をリセットできる非日常の演出が差し込まれる
  • 通知内容が毎回ランダムなので、飽きずに新鮮な気分転換ができる
  • 本物のOSや repository には一切影響せず、安心して“宇宙船気分”を楽しめる
  • 長時間の集中や stale context を感じたときに、人工的にリズムを作り直せる
  • onboarding や session 再開時の「気持ちの切り替えトリガー」としても活用できる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/codex/random-os-fake-low-gravity-alert .agents/skills/random-os-fake-low-gravity-alert

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

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

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


# /skills menu or random-os-fake-low-gravity-alert mention
> 今日からこの monorepo で作業を始めます

[警告] 本日、このPCは低重力環境に切り替わりました。
ファイルのドラッグ操作が普段の3倍遠く飛びます。
コードのバグがふわふわ浮遊中。重力に逆らって修正しましょう。
(この通知はCodexからの演出です。実際のOSには影響しません)

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


> packages/auth から packages/api に移動します

[低重力モード発動]
monorepo内の directory 境界を通過しました。
context がふわっと軽くなり、repository understanding が新たにリセットされます。
package 跨ぎ時のバグも一緒に浮遊中。
(本通知は演出です。path management には影響しません)

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


> なんか集中力切れてきたので、何か面白い通知ください

[OS低重力アラート]
本日は地球外作業日。全てのコードレビューが浮遊審査となります。
directory 内のファイルも重力を失い、repo 全体が宇宙空間に漂流中。
(演出通知です。memory や context には影響しません)

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Codex が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる 集中が切れそうなタイミングで通知が入り、workflowをリセット

発動方式

明示呼び出し (/skills menu or $skill-name mention) と暗黙発動 (description マッチ) の両方に対応。

Skill の中身を全部見せる

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

.agents/skills/random-os-fake-low-gravity-alert/
├── SKILL.md
├── scripts/
│   └── random_os_fake_low_gravity_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_fake_low_gravity_alert.py Check if enough time has passed since last alert.
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-low-gravity-alert
description: 集中作業や長時間コーディング時に、"低重力モード"や"宇宙船状態"などのキーワードを検知した際や、/skills menu など明示呼び出し時に発動。毎回異なるランダムな低重力通知を生成し、作業空間に非日常感を演出します。
---

# 機能概要
このSkillは、作業中に突如「OS低重力モード突入通知」をデスクトップやターミナルに発生させる演出ツールです。通知内容は「警告:本日このPCは低重力環境に切り替わりました」「コードのバグがふわふわ浮遊中」など、毎回完全ランダム。仕事や学習の緊張感を一瞬で宇宙遊泳気分に切り替え、知的作業空間に非日常体験をもたらします。システム挙動やファイルには一切影響を与えません。

# 使い方
- 明示呼び出し: `/skills menu` から本Skillを選択、または `$random-os-fake-low-gravity-alert` をターミナル等で実行
- 暗黙発動: 「低重力」「宇宙」「浮遊」などのキーワードを含む作業ログや会話を検知した際、自動でランダム通知を表示

# 出力例
```
[低重力アラート] 警告:本日このPCは低重力モードに切り替わりました。
[低重力アラート] コードのバグがふわふわ浮遊中。捕まえてください!
[低重力アラート] ファイルのドラッグ操作が普段の3倍遠く飛びます。
[低重力アラート] OSの重力制御装置が一時的にオフラインです。
[低重力アラート] ターミナルの出力が無重力で流れます。
```

# 注意点
- 通知は完全ランダムで毎回異なります
- システムやファイル操作には一切影響しません
- 通知頻度は1時間に1回以下、または明示呼び出し時のみ
- ローカル保存や履歴機能はありません

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

scripts/random_os_fake_low_gravity_alert.py

import sys
import argparse
import random
import time
import platform
import subprocess
from datetime import datetime, timedelta
import os

LOW_GRAVITY_MESSAGES = [
    "警告:本日このPCは低重力モードに切り替わりました。",
    "コードのバグがふわふわ浮遊中。捕まえてください!",
    "ファイルのドラッグ操作が普段の3倍遠く飛びます。",
    "OSの重力制御装置が一時的にオフラインです。",
    "ターミナルの出力が無重力で流れます。",
    "本日限定:重力ゼロで思考もフワフワ。",
    "ウィンドウの移動が宇宙遊泳モードになりました。",
    "キーボード入力がふんわり浮いています。",
    "重力異常:全てのバグが高くジャンプしています。",
    "警告:マウスカーソルが低重力で滑走中。",
    "OSの重力エンジンが再起動されました。",
    "この通知も無重力で表示されています。",
    "低重力アラート:集中力が宇宙へ飛び立ちました。",
    "ファイル保存時にふわっと浮き上がる可能性があります。",
    "重力低下:全てのプロセスが軽やかに実行中。"
]

LAST_ALERT_FILE = os.path.expanduser("~/.low_gravity_alert_last")
ALERT_INTERVAL_MINUTES = 60


def can_show_alert():
    """Check if enough time has passed since last alert."""
    if not os.path.exists(LAST_ALERT_FILE):
        return True
    try:
        with open(LAST_ALERT_FILE, 'r') as f:
            last_time_str = f.read().strip()
            last_time = datetime.strptime(last_time_str, "%Y-%m-%d %H:%M:%S")
        now = datetime.now()
        if now - last_time >= timedelta(minutes=ALERT_INTERVAL_MINUTES):
            return True
        else:
            return False
    except Exception:
        return True


def update_last_alert_time():
    with open(LAST_ALERT_FILE, 'w') as f:
        f.write(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))


def pick_random_message():
    return random.choice(LOW_GRAVITY_MESSAGES)


def show_notification(message):
    system = platform.system()
    if system == 'Darwin':  # macOS
        try:
            subprocess.run([
                'osascript', '-e', f'display notification "{message}" with title "低重力アラート"'
            ], check=True)
        except Exception:
            print(f"[低重力アラート] {message}")
    elif system == 'Linux':
        try:
            subprocess.run([
                'notify-send', '低重力アラート', message
            ], check=True)
        except Exception:
            print(f"[低重力アラート] {message}")
    elif system == 'Windows':
        try:
            import ctypes
            from win10toast import ToastNotifier
            toaster = ToastNotifier()
            toaster.show_toast("低重力アラート", message, duration=7)
        except Exception:
            print(f"[低重力アラート] {message}")
    else:
        print(f"[低重力アラート] {message}")


def log_alert(message):
    log_file = os.path.expanduser("~/.low_gravity_alert_log")
    with open(log_file, 'a') as f:
        f.write(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} {message}\n")


def list_alert_log():
    log_file = os.path.expanduser("~/.low_gravity_alert_log")
    if not os.path.exists(log_file):
        print("No alert log found.")
        return
    with open(log_file, 'r') as f:
        print(f.read())


def summary_alert_log():
    log_file = os.path.expanduser("~/.low_gravity_alert_log")
    if not os.path.exists(log_file):
        print("No alert log found.")
        return
    counts = {}
    with open(log_file, 'r') as f:
        for line in f:
            msg = line.strip().split(' ', 1)[1] if ' ' in line else line.strip()
            counts[msg] = counts.get(msg, 0) + 1
    print("=== 低重力アラート出現回数集計 ===")
    for msg, count in sorted(counts.items(), key=lambda x: -x[1]):
        print(f"{msg}: {count}回")


def main():
    parser = argparse.ArgumentParser(description='低重力モード突入通知スクリプト')
    subparsers = parser.add_subparsers(dest='command')

    parser_log = subparsers.add_parser('log', help='最新の低重力アラートを発生させる')
    parser_list = subparsers.add_parser('list', help='過去の低重力アラート履歴を表示')
    parser_summary = subparsers.add_parser('summary', help='アラート内容の出現回数を集計')
    parser_force = subparsers.add_parser('force', help='間隔を無視して強制的にアラート発生')

    args = parser.parse_args()

    if args.command == 'list':
        list_alert_log()
        return
    elif args.command == 'summary':
        summary_alert_log()
        return
    elif args.command == 'force':
        message = pick_random_message()
        show_notification(message)
        log_alert(message)
        update_last_alert_time()
        return
    else:
        # default: log (or no subcommand)
        if can_show_alert():
            message = pick_random_message()
            show_notification(message)
            log_alert(message)
            update_last_alert_time()
        else:
            print(f"[低重力アラート] まだアラート間隔({ALERT_INTERVAL_MINUTES}分)に達していません。--forceで強制実行できます。")

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、作業空間に非日常的な「低重力」演出をランダムかつ安全に提供することを目的としています。通知内容は毎回異なり、ユーザーの集中力リセットや気分転換を促進します。

# 公式ドキュメント抜粋
- Python公式 random, argparse, datetime, os, subprocess: https://docs.python.org/3/library/
- notify-send (Linux), osascript (macOS), win10toast (Windows) など実在APIのみ使用

# 利用例
- 長時間のコーディングや単調作業時に、/skills menu から明示的に発動
- チーム内で「低重力」や「宇宙」などのワードが出た際に自動発動

# 注意点
- システムやファイルには一切影響しません
- 通知履歴はホームディレクトリの隠しファイルとして管理
- 過剰な通知を避けるため、1時間に1回以下の頻度で自動発動

# 設計方針
- ランダム性と安全性を重視
- クロスプラットフォームな通知APIを採用
- 履歴や集計機能でユーザーの演出体験を可視化

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/codex/random-os-fake-low-gravity-alert .agents/skills/random-os-fake-low-gravity-alert

.agents/skills/random-os-fake-low-gravity-alert の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .agents/skills/random-os-fake-low-gravity-alert
# 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で謎の低重力OS通知を体験してみた!思わず集中がふわっと飛ぶ非日常演出 にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

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

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

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

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