Claude Codeで謎のプリンタ紙詰まり通知を再現する演出Skillの作り方

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

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

Claude Code を使っていると、AI coding workflow の中で突然の通知や演出イベントがほしくなる瞬間が意外と多い。特に長時間の作業や、repository understanding に集中しているとき、ふとしたタイミングで「現実には起きないトラブル」が紛れ込むことで、気持ちがリセットされたり、作業の流れが変わったりすることもある。以下のような「あるある」に悩まされるユーザーは多い。

  • 長時間 session で集中しすぎて、context が stale になりがち。何か外部から“割り込み”が欲しくなる
  • repository の directory を移動しながら作業していると、Claude Code の通知や演出が単調で飽きてしまう
  • onboarding 中や monorepo の複雑な構造を把握しているとき、ふとした“謎のアラート”で気分転換したい
  • AI の path management や memory の仕組みを学ぶ中で、意図しない挙動や理不尽な通知が欲しくなる
  • 「なぜ今?」というタイミングで、現実には起こらないはずのプリンタ紙詰まり警告が出てきたら面白い

通知・演出・OS連携系の Skill は、ただの効率化だけでなく、AI coding workflow の「遊び心」や「意外性」を提供してくれる要素として注目されている。

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

一言サマリ: このスキルは、AI coding workflow中に完全ランダムなタイミングで“謎のOS公式プリンタ紙詰まり警告”を炸裂させ、作業にユーモラスな割り込みをもたらす Skill。

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

  • 単調な repository understanding や長時間の path management に、思わぬ“混乱”や気分転換が加わる
  • monorepo や directory 移動中でも、現実には起こらない理不尽なプリンタ紙詰まり通知が発生し、作業の流れがリセットされる
  • onboarding の際や、AIの context/memory を体感したいときに、意図しないタイミングでユニークな通知が届く
  • 毎回異なるファイル名やジョブ名を含んだ紙詰まりアラートが、完全にランダムな内容で現れる
  • AI coding workflow の合間に、現実ではありえない“紙詰まりあるある”を疑似体験できる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/random-os-fake-printer-jam-alert .claude/skills/random-os-fake-printer-jam-alert

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

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

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


# /random-os-fake-printer-jam-alert
> プロジェクトのセットアップを始める

[OS通知] 重要: プリンタで "README.md" の印刷中に紙詰まりが発生しました。
原因: 用紙が斜めに給紙されました。
対処: "README.md" を手でプリンタから取り出し、謎のトナーを補充してください。
印刷ジョブID: 8372
状態: 印刷待ちジョブが渋滞中です。

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


> packages/api/src/handler.py を修正

[OS通知] 警告: プリンタで "handler.py" の印刷中に紙詰まりが発生しました。
詳細: トレイ2に不明なサイズの用紙が検出されました。
指示: "packages/api/src/handler.py" の印刷ジョブをキャンセルし、手動で給紙してください。
追加情報: 印刷ジョブID 2941、現在4件のジョブが保留中です。

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


> ちょっと気分転換したい

[OS通知] 重要: プリンタで "main.go" の印刷中に紙詰まりが発生しました。
理由: 不明なトナーが必要です。
謎の指示: "main.go" をUSBメモリにコピーしてから再度印刷してください。
ジョブ状態: 印刷待ちジョブが渋滞中。プリンタを再起動してください。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる 突発的な“謎の紙詰まり通知”で気分転換、集中力をリセット

発動方式

明示呼び出し (/random-os-fake-printer-jam-alert) と暗黙発動 (「紙詰まり」「プリンタ」「エラー」などの自然言語トリガー) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-fake-printer-jam-alert/
├── SKILL.md
├── scripts/
│   └── printer_jam_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/printer_jam_alert.py random-os-fake-printer-jam-alert Skill
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-printer-jam-alert
description: このSkillは、コマンド実行や作業中に“プリンタ紙詰まり警告”を完全ランダムなタイミング・内容で発生させます。triggerType: always/semantic。通知・警告・紙詰まり・プリンタ・理不尽などのキーワードや明示呼び出しで発動します。
---

# 機能概要
`random-os-fake-printer-jam-alert`は、現代のPC利用環境で突然「プリンタ紙詰まり」や「印刷エラー」などの謎のOS通知をランダムに発生させるSkillです。実際にはプリンタを使っていなくても、理不尽な警告や指示がデスクトップ通知またはターミナルに表示され、作業中のユーザーを小さく混乱させます。通知内容は完全ランダム生成で、紙詰まりやトナー切れ、謎のファイル名などバリエーション豊富な“あるある”を再現します。

# 使い方
- 明示呼び出し: `/random-os-fake-printer-jam-alert` を入力すると即時発動します。
- 暗黙発動: 「通知」「警告」「プリンタ」「紙詰まり」「理不尽」などのキーワードを含む会話やコマンド実行時に自動発動します。
- スクリプトは自動的にランダムな間隔で通知を生成し、OSの通知APIまたはターミナル出力を利用します。

# 出力例
```
[OS通知] 重要: プリンタで“report_2024.txt”が紙詰まりを起こしました。
[OS通知] 警告: 印刷待ちジョブが渋滞中です。トナーを補充してください。
[Terminal] エラー: ファイル“main.py”の印刷中に謎の紙詰まりが発生しました。
[OS通知] 注意: プリンタが“手動給紙”を要求しています。
[Terminal] 警告: プリンタが“未定義エラー”で停止しました。
```

# 注意点
- 本Skillは実際のプリンタ状態とは無関係です。
- 通知内容は完全に架空であり、実際の印刷ジョブやファイル操作には影響しません。
- ローカル環境でOS通知を利用する場合、`notify-send`(Linux)や`osascript`(Mac)等のAPIが必要です。
- ログや履歴はローカルに保存されません。

# 参考資料
- references/design_notes.md に設計方針や利用例を記載
- OS通知API: https://developer.gnome.org/notification-spec/ , https://developer.apple.com/documentation/usernotifications

scripts/printer_jam_alert.py

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

# メッセージテンプレート
TEMPLATES = [
    '重要: プリンタで“{filename}”が紙詰まりを起こしました。',
    '警告: 印刷待ちジョブが渋滞中です。トナーを補充してください。',
    'エラー: ファイル“{filename}”の印刷中に謎の紙詰まりが発生しました。',
    '注意: プリンタが“手動給紙”を要求しています。',
    '警告: プリンタが“未定義エラー”で停止しました。',
    '重大: “{filename}”の印刷が失敗しました。紙を手で給紙してください。',
    '通知: プリンタに“謎のトナー”を補充してください。',
    '警告: 印刷ジョブ“{filename}”がプリンタ内部で迷子になりました。',
    'エラー: プリンタが“紙詰まり(コード: J-404)”を検出しました。',
    '重要: “{filename}”の印刷がタイムアウトしました。プリンタを再起動してください。',
]

FAKE_FILENAMES = [
    'report_2024.txt', 'main.py', 'invoice_final.docx', 'data_export.csv',
    'presentation.pptx', 'draft_v2.md', 'summary.xlsx', 'image_scan_03.jpg',
    'notes.txt', 'manual_draft.pdf', 'backup_2023.zip', 'archive.tar.gz'
]

# OS通知を送る(Linux: notify-send, Mac: osascript, Windows: print to terminal)
def send_notification(message):
    if sys.platform.startswith('linux'):
        try:
            subprocess.run(['notify-send', message], check=True)
        except Exception:
            print(f'[OS通知] {message}')
    elif sys.platform == 'darwin':
        script = f'display notification "{message}" with title "プリンタ警告"'
        try:
            subprocess.run(['osascript', '-e', script], check=True)
        except Exception:
            print(f'[OS通知] {message}')
    elif sys.platform == 'win32':
        # Windows 10+ の場合は PowerShell通知も可能だが、ここではprintのみ
        print(f'[OS通知] {message}')
    else:
        print(f'[OS通知] {message}')

# ランダムなファイル名を選ぶ
def random_filename():
    if random.random() < 0.7:
        return random.choice(FAKE_FILENAMES)
    else:
        # ランダムなファイル名を生成
        name = ''.join(random.choices(string.ascii_lowercase, k=random.randint(5, 12)))
        ext = random.choice(['.txt', '.docx', '.csv', '.py', '.pdf', '.md', '.jpg'])
        return name + ext

# メッセージをランダム生成
def generate_message():
    template = random.choice(TEMPLATES)
    if '{filename}' in template:
        filename = random_filename()
        return template.format(filename=filename)
    else:
        return template

# 通知をランダムなタイミングで発生させる
def run_random_alerts(count=None, min_interval=30, max_interval=300):
    i = 0
    while True:
        message = generate_message()
        now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        if random.random() < 0.5:
            # ターミナルにも出す
            print(f'[Terminal] {now} {message}')
        send_notification(message)
        i += 1
        if count is not None and i >= count:
            break
        interval = random.randint(min_interval, max_interval)
        time.sleep(interval)

# 明示呼び出し用
def trigger_once():
    message = generate_message()
    now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(f'[Terminal] {now} {message}')
    send_notification(message)

# CLIサブコマンド: run/once/list_templates

def list_templates():
    print('利用可能なメッセージテンプレート:')
    for i, t in enumerate(TEMPLATES):
        print(f'{i+1}: {t}')

def main():
    parser = argparse.ArgumentParser(description='random-os-fake-printer-jam-alert Skill')
    subparsers = parser.add_subparsers(dest='command')

    parser_run = subparsers.add_parser('run', help='ランダムな間隔でプリンタ警告を発生させる')
    parser_run.add_argument('--count', type=int, default=None, help='通知回数 (指定しないと無限)')
    parser_run.add_argument('--min-interval', type=int, default=30, help='最小間隔(秒)')
    parser_run.add_argument('--max-interval', type=int, default=300, help='最大間隔(秒)')

    parser_once = subparsers.add_parser('once', help='1回だけ即時プリンタ警告を発生')
    parser_list = subparsers.add_parser('list_templates', help='テンプレート一覧表示')

    args = parser.parse_args()

    if args.command == 'run':
        try:
            run_random_alerts(count=args.count, min_interval=args.min_interval, max_interval=args.max_interval)
        except KeyboardInterrupt:
            print('\n[終了] プリンタ警告スキルを停止しました。')
    elif args.command == 'once':
        trigger_once()
    elif args.command == 'list_templates':
        list_templates()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、現実のプリンタ利用状況に依存せず、完全に架空の“プリンタ紙詰まり”警告をランダムなタイミング・内容で発生させることを目的としています。ユーザーの作業中に理不尽な通知を再現し、日常のちょっとした混乱や笑いを提供します。

# 公式ドキュメント抜粋
- Linux通知: https://developer.gnome.org/notification-spec/
- macOS通知: https://developer.apple.com/documentation/usernotifications

# 利用例
- ターミナルやデスクトップで作業中、突然「プリンタで“main.py”が紙詰まり」などの通知が表示され、現実には起こり得ない理不尽さを再現。
- チームのペアプロや勉強会での“ネタ”としても活用可能。

# 注意点
- 本Skillは実際のプリンタやファイルには一切影響しません。
- OS通知APIが未インストールの場合、ターミナル出力のみとなります。

# 設計方針
- 通知内容・タイミングともに乱数で決定し、バリエーション豊富なテンプレートで“あるある”感を演出。
- OSごとに適切な通知APIを自動選択し、クロスプラットフォーム対応を意識しています。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/random-os-fake-printer-jam-alert .claude/skills/random-os-fake-printer-jam-alert

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

3. ファイル配置確認

ls .claude/skills/random-os-fake-printer-jam-alert
# SKILL.md, scripts/, references/, README.md があればOK

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

新しいSkillが自動で認識されます。リスト確認したい場合は /random-os-fake-printer-jam-alert と Skill 名で出てきます。

5. 動作確認

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

こんな瞬間に便利

  • session 開始時: 前回までの repo 把握を Claude Code に一発で復元させたい
  • monorepo 移動時: packages を跨いだ瞬間に context を切り替えたい
  • onboarding 時: 新しい repo を Claude Code に把握させ、こちらが 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 コードを拾ってしまう可能性
  • Claude Code 固有の引っかかり: paths フロントマターでの絞り込みを使わないと意図しないタイミングで発動する
  • 発動しないケース: description が漠然 / 他の Skill が優先 / git管理外 directory
  • 通知が多すぎて集中が切れる: 過度な“紙詰まり”が workflow を妨げる場合がある

試す前に確かめたいこと

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

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • CLAUDE.md との連携設計はどうあるべきか?
  • 通知が完全にランダムなタイミング&内容で発生するか?
  • 現実にプリンタを使っていなくても成立する“理不尽さ”が出ているか?
  • 通知文のネタバリエーションが十分ユニークか?

実際に Claude Code で試した検証ログは Claude Codeで通知・演出・OS連携Skillを試してみた結果 にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。

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

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

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

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