Codexで謎のライセンス期限通知を演出して作業に刺激を加える方法

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

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

長時間の開発や大規模リポジトリでの作業をCodexと進めていると、集中力が切れたり、単調な作業に飽きてしまう瞬間が少なくありません。特に、repoやdirectory構造の把握やcontext管理に追われていると、気分転換のきっかけもなく、無機質な作業が続きがちです。通知や演出Skillを入れても、実用的なものばかりで「遊び心」や「意外性」が足りないと感じるユーザーも多いはずです。

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

こうした「context管理の疲れ」や「作業の単調さ」に、ちょっとしたスパイスや気分転換が欲しいと思う瞬間は意外と多いものです。

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

一言サマリ: このスキルは作業中ふとした瞬間にSkill。

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

  • 退屈な長時間開発や単調なAI coding workflowに、意外性のある“謎のOSライセンス警告”でリズムや気分転換を生む (context維持の合間に遊び心をプラス)
  • monorepoや複雑なdirectory作業時に、突然の“理不尽通知”が入り、集中しすぎて煮詰まった状態をリセットできる
  • onboardingやsession再開時の“お約束説明”に飽きた空気を一変させ、チーム内コミュニケーションのネタにもなる
  • 実害ゼロで安全、repository understandingやpath managementの流れを邪魔せずに遊び要素だけを追加できる
  • Skillの通知・演出・OS連携カテゴリの中でも唯一無二の“意味不明な安心感”が得られる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/codex/random-os-fake-mystery-license-alert .agents/skills/random-os-fake-mystery-license-alert

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

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

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


# /skills menu or random-os-fake-mystery-license-alert mention
> プロジェクトの初期セットアップを開始

[WARNING] あなたの「Ctrlキー」のライセンスは本日23:59で失効します。
有効なライセンスを取得しない場合、Ctrl+CおよびCtrl+V機能が制限される可能性があります。
詳細: /etc/licenses/ctrl.key
サポート窓口: support@os-license-mystery.invalid

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


> packages/api/ ディレクトリに移動

[ALERT] 「Caps Lock」デバイスの試用期間は終了しました。
本日以降、パッケージ名を大文字で入力する機能は一部制限されます。
ライセンス更新方法: /usr/share/licenses/capslock.txt
影響範囲: packages/api/, packages/web/

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


> 眠気覚ましに何か面白い通知を

[NOTICE] 「NumPad-7」仮想デバイスのライセンスが失効しました。
今後、7を含むディレクトリ名の作成は一時的にブロックされます。
解除には“7”の発音練習が必要です。
詳細: /var/log/mystery-license.log

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/random-os-fake-mystery-license-alert/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。

.agents/skills/random-os-fake-mystery-license-alert/
├── SKILL.md
├── scripts/
│   └── random_os_fake_mystery_license_alert.py
└── references/
    └── reference.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_fake_mystery_license_alert.py Random OS Fake Mystery License Alert
references/reference.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-mystery-license-alert
description: 作業中やコマンド実行時、または/skillsメニュー呼び出し時に、謎の“OSライセンス期限切れ”風通知をランダムな内容・タイミングで発動。通知・演出・集中妨害などのキーワードが含まれる場合にも自動発動します。
---

# 機能概要
このSkillは、日常の作業や開発現場に突如として現れる“謎のOSライセンス期限切れ通知”を模倣します。通知内容は実在しないデバイスや機能(例:Ctrlキー、Caps Lock、NumPad、仮想RAM、システム時刻同期機能など)のライセンス失効や試用期間終了を、妙に本格的な警告文体で表示。実害やシステム変更は一切ありませんが、退屈な作業や深夜の集中タイムに、理不尽なスパイスや笑いを提供します。

# 使い方
- 明示呼び出し例: `/skills random-os-fake-mystery-license-alert` またはスキルメニューから選択。
- 暗黙発動: 「通知」「演出」「集中妨害」「OS」「ライセンス」「期限切れ」などのキーワードを含む会話やコマンド実行時に自動発動。
- バックグラウンドでランダムな間隔(5~30分程度)でも自動的に通知が表示されます。

# 出力例
```
[ALERT] OSライセンス警告: あなたのCtrlキーのライセンスは本日24:00をもって失効します。再認証を行ってください。
[WARNING] Caps Lock機能は試用期間を超過しました。継続利用には管理者権限が必要です。
[NOTICE] 仮想RAM拡張モジュールのライセンスが期限切れです。パフォーマンス低下の可能性があります。
[ALERT] システム時刻同期サービスの利用権が失効しました。手動同期を推奨します。
[WARNING] NumPadエミュレータのライセンスが本日失効しました。
```

# 注意点
- 実際のシステム設定やファイルには一切影響しません。
- 通知内容は完全に架空であり、ユーザーの作業やデータを妨害・削除することはありません。
- ローカル保存や外部送信は行いません。
- 長時間セッションでは通知頻度が高まる場合があります。

# 参考資料
本Skillは、Pythonの`notify2`(Linux)、`plyer`(クロスプラットフォーム)、`os`、`random`、`time`モジュール等の公式APIを利用しています。詳細はreferences/以下や各公式ドキュメント(https://plyer.readthedocs.io/en/latest/、https://notify2.readthedocs.io/en/latest/)を参照してください。

scripts/random_os_fake_mystery_license_alert.py

import os
import sys
import time
import random
import argparse
import threading

try:
    from plyer import notification
    PLYER_AVAILABLE = True
except ImportError:
    PLYER_AVAILABLE = False

LICENSE_ITEMS = [
    'Ctrlキー', 'Caps Lock', 'NumPad', '仮想RAM拡張モジュール', 'システム時刻同期サービス',
    'Altキー', 'Fnキー', 'Bluetooth Stack', 'USB Root Hub', 'タッチパッド感度調整',
    'スクリーンショット機能', 'クリップボード履歴', '仮想デスクトップ', 'ウィンドウスナップ',
    'ダークモード', 'サウンドミュート', 'バッテリー残量表示', '通知センター', 'フォントレンダラー',
    'デバイスマネージャ', 'プリンタドライバ', 'Wi-Fi自動接続', 'ネットワークプロファイル',
    'タスクスケジューラ', 'スクリーンセーバー', 'デバイス暗号化', 'マウス加速度', '仮想メモリ',
    'ログイン画面カスタマイズ', 'プロセスモニタ', 'ファイルインデックス', 'IME変換エンジン',
    'ウィンドウ透明度', 'システム通知音', 'USBデバッグ', 'システム復元', '自動アップデート'
]

MESSAGE_TEMPLATES = [
    '[ALERT] OSライセンス警告: あなたの{item}のライセンスは本日24:00をもって失効します。再認証を行ってください。',
    '[WARNING] {item}機能は試用期間を超過しました。継続利用には管理者権限が必要です。',
    '[NOTICE] {item}のライセンスが期限切れです。パフォーマンス低下の可能性があります。',
    '[ALERT] {item}の利用権が失効しました。手動設定を推奨します。',
    '[WARNING] {item}のライセンスが本日失効しました。',
    '[NOTICE] {item}の認証期限が切れています。サポート窓口へご連絡ください。',
    '[ALERT] {item}のライセンスが無効です。機能制限モードで動作します。',
    '[WARNING] {item}の利用は本日までです。アップグレードをご検討ください。',
    '[NOTICE] {item}のライセンス認証が必要です。',
    '[ALERT] {item}の試用期間が終了しました。'
]


def generate_random_message():
    item = random.choice(LICENSE_ITEMS)
    template = random.choice(MESSAGE_TEMPLATES)
    return template.format(item=item)


def send_notification(message):
    if PLYER_AVAILABLE:
        notification.notify(
            title='OSライセンス警告',
            message=message,
            app_name='random-os-fake-mystery-license-alert',
            timeout=8
        )
    else:
        # Fallback: print to stderr
        print(message, file=sys.stderr)


def alert_once(args):
    message = generate_random_message()
    send_notification(message)
    if args.log:
        with open(args.log, 'a', encoding='utf-8') as f:
            f.write(f'{time.strftime("%Y-%m-%d %H:%M:%S")} {message}\n')


def alert_loop(args):
    count = 0
    try:
        while args.times is None or count < args.times:
            wait_sec = random.randint(args.min_interval, args.max_interval)
            time.sleep(wait_sec)
            message = generate_random_message()
            send_notification(message)
            if args.log:
                with open(args.log, 'a', encoding='utf-8') as f:
                    f.write(f'{time.strftime("%Y-%m-%d %H:%M:%S")} {message}\n')
            count += 1
    except KeyboardInterrupt:
        print('Alert loop interrupted by user.')


def list_templates(args):
    print('--- 利用可能な通知テンプレート ---')
    for t in MESSAGE_TEMPLATES:
        print(f'- {t}')
    print('\n--- ライセンス対象アイテム例 ---')
    for i in LICENSE_ITEMS:
        print(f'- {i}')


def summary(args):
    print('Skill: random-os-fake-mystery-license-alert')
    print('架空のOS機能・デバイスのライセンス期限切れ通知を、ランダムなタイミング・内容で発生させます。')
    print('実害なし・通知のみ。')
    print('通知対象やテンプレートはlistコマンドで確認可能。')


def parse_args():
    parser = argparse.ArgumentParser(description='Random OS Fake Mystery License Alert')
    subparsers = parser.add_subparsers(dest='subcmd', required=True)

    parser_once = subparsers.add_parser('once', help='1回だけ通知を表示')
    parser_once.add_argument('--log', help='通知内容を指定ファイルに追記')
    parser_once.set_defaults(func=alert_once)

    parser_loop = subparsers.add_parser('loop', help='ランダム間隔で繰り返し通知')
    parser_loop.add_argument('--min-interval', type=int, default=300, help='最小待機秒数 (default: 300)')
    parser_loop.add_argument('--max-interval', type=int, default=1800, help='最大待機秒数 (default: 1800)')
    parser_loop.add_argument('--times', type=int, help='通知回数 (指定しない場合は無限)')
    parser_loop.add_argument('--log', help='通知内容を指定ファイルに追記')
    parser_loop.set_defaults(func=alert_loop)

    parser_list = subparsers.add_parser('list', help='通知テンプレートとアイテム一覧')
    parser_list.set_defaults(func=list_templates)

    parser_summary = subparsers.add_parser('summary', help='Skill概要')
    parser_summary.set_defaults(func=summary)

    return parser.parse_args()


def main():
    args = parse_args()
    args.func(args)

if __name__ == '__main__':
    main()

references/reference.md

# 概要
このSkillは、実在しないOS機能やデバイスの“ライセンス失効”を模した通知を、Pythonスクリプトでランダムに生成・表示します。主に開発現場や作業中の息抜き、ジョーク用途を想定しています。

# 公式ドキュメント抜粋
- plyer: クロスプラットフォームな通知API。https://plyer.readthedocs.io/en/latest/
- notify2: Linux向け通知API。https://notify2.readthedocs.io/en/latest/
- Python標準: os, random, argparse, time

# 利用例
- `/skills random-os-fake-mystery-license-alert` で即時通知
- `python random_os_fake_mystery_license_alert.py loop --min-interval 600 --max-interval 1200` で10~20分ごとに自動通知
- `python random_os_fake_mystery_license_alert.py list` でテンプレート一覧

# 注意点
- 実際のシステムやファイルには影響を与えません。
- 通知内容は完全なフィクションです。
- 通知頻度が高すぎると作業妨害になる場合があります。

# 設計方針
- 実害ゼロ・外部送信ゼロ・ユーザー体験のみに特化
- CLIから柔軟に制御可能
- 拡張性を考慮し、テンプレートや対象アイテムはリストで管理

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/codex/random-os-fake-mystery-license-alert .agents/skills/random-os-fake-mystery-license-alert

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

3. ファイル配置確認

ls .agents/skills/random-os-fake-mystery-license-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連携Skillを試してみた結果 にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

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

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

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

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