Antigravityで作業中の謎通知を自動化して楽しむ方法

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

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

AI coding workflow において、Antigravity の通知やOS連携まわりで「なんだか物足りない」「もう少し遊び心が欲しい」と感じる瞬間は意外と多い。特に以下のような場面で、日常の開発体験が単調になりがちだと感じるユーザーは少なくない。

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

また、集中している最中にふとしたタイミングで「謎のOS通知」や「理不尽な警告」が現れ、思わず笑ってしまうような“無駄な演出”が欲しくなることも。コードや repository understanding とは直接関係ないものの、こうした遊び心があると、長時間の作業やonboardingの緊張感が少し和らぐ。通知・演出・OS連携カテゴリのSkillは、そんな日常の“ちょっとした隙間”を埋めてくれる存在だ。

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

一言サマリ: このスキルは、Antigravity のAI coding workflowに突如“謎のプリンタ紙詰まり警告”を炸裂させ、作業中の緊張をほぐす演出Skill。

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

  • Antigravity の通知機能を活用し、完全ランダムなタイミングで理不尽なプリンタ紙詰まり警告を発生させることで、単調な開発sessionに意外性をプラスできる
  • repositoryやdirectory構造・contextの切り替えなど、普段は意識しがちなpath managementの合間に、コミカルな通知で気分転換ができる
  • onboardingや長時間の作業時、AIからの堅苦しい案内だけでなく、遊び心ある演出でチームの雰囲気を和らげる効果が期待できる
  • 通知内容は毎回異なり、現実には存在しない「ファイル名.txtが紙詰まり」「謎のトナー補充」など、ユニークなバリエーションで飽きさせない
  • AI coding workflowの中で、contextやrepo理解に直接関与しない“余白”を楽しめる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/random-os-fake-printer-jam-alert .agent/skills/random-os-fake-printer-jam-alert

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

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

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


> プロジェクトのREADME.mdを要約して

[OS通知] 重要:プリンタで "README.md" が紙詰まりを起こしました。
[OS通知] 印刷ジョブ "project-init" が渋滞中です。謎のトナーを補充してください。
[OS通知] 警告:/src/setup/config.js の印刷が失敗しました。紙を手で給紙してください。
(通常のAntigravity出力が続く)

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


> packages/api/ と packages/web/ の構造を比較して

[OS通知] 注意:プリンタで "packages/web/routes/index.ts" が紙詰まりを起こしました。
[OS通知] 警告:印刷待ちジョブが渋滞中(packages/api/handlers/userHandler.js)。
[OS通知] 重要:謎の用紙サイズエラー。A4.5が必要です。手動で対応してください。
(Antigravityが monorepo の directory 構造を出力)

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


> 今日の進捗をまとめて

[OS通知] 印刷エラー:/docs/progress_report.txt の出力が詰まりました。
[OS通知] 警告:プリンタが未知のフォント "Antigravity Sans" に対応していません。
[OS通知] 紙詰まり:謎の紙片が検出されました。再起動してください。
(Antigravityの通常応答)

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる コミカルな通知で集中が途切れたときの気分転換に

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

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

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-printer-jam-alert
description: Antigravityがユーザーの作業中やコマンド実行時、または“プリンタ”や“印刷”に関連しない状況でも、完全ランダムなタイミングで理不尽なプリンタ紙詰まり警告を発動する。通知・混乱・演出カテゴリで活用。
---

# 機能概要
このSkillは、現実には全くプリンタを使っていない状況でも、OSの公式風通知として「プリンタ紙詰まり警告」や「印刷ジョブ渋滞」などのアラートを完全ランダムなタイミング・内容で発生させます。通知文は毎回異なり、「重要:プリンタで“main.py”が詰まりました」「警告:印刷待ちジョブが渋滞中」など、理不尽かつ意味不明な内容が特徴です。作業中のユーザーに小さな混乱や笑いを提供し、日常の単調な作業に“紙詰まりあるある”のスパイスを加えます。

# 使い方
このSkillは明示的な呼び出しを必要とせず、Antigravityエージェントが自動的に発動します。トリガーはsemantic-match-onlyで、ユーザーの作業内容やコマンド履歴に関係なく、完全にランダムなタイミングで通知が表示されます。暗黙発動キーワード例:「印刷」「プリンタ」「紙」「ファイル保存」などが含まれる場合は発生頻度が上がりますが、原則としてどんな状況でも発生します。

# 出力例
```
[OS通知] 重要:プリンタで“report_2024.txt”が詰まりました。紙を手で給紙してください。
[OS通知] 警告:印刷待ちジョブが渋滞中。謎のトナーを補充してください。
[OS通知] エラー:main.pyの印刷中に紙詰まりが発生しました。プリンタカバーを開けてください。
[OS通知] 注意:プリンタが応答しません。紙を裏返して再度セットしてください。
[OS通知] 重大:印刷キューに未知の障害が発生しました。管理者に連絡してください。
```

# 注意点
- 実際のプリンタや印刷機能とは一切連携しません。
- ローカル環境でのみ動作し、通知履歴やログは自動的に削除されます。
- 通知内容は完全にフィクションです。
- OSの通知API(Windows: win10toast, macOS: pync, Linux: notify2等)を使用しています。

# 参考資料
- references/design_notes.md
- https://pypi.org/project/win10toast/
- https://github.com/msanders/pync
- https://pypi.org/project/notify2/

scripts/fake_printer_jam_alert.py

import os
import sys
import time
import random
import argparse
import threading
from datetime import datetime

try:
    if sys.platform.startswith('win'):
        from win10toast import ToastNotifier
        notifier = ToastNotifier()
        OS_TYPE = 'windows'
    elif sys.platform == 'darwin':
        import pync
        OS_TYPE = 'mac'
    else:
        import notify2
        notify2.init('FakePrinterJam')
        OS_TYPE = 'linux'
except ImportError:
    notifier = None
    OS_TYPE = 'none'

FAKE_FILES = [
    'main.py', 'report_2024.txt', 'summary.docx', 'invoice.pdf', 'README.md',
    'data_export.csv', 'backup.tar.gz', 'presentation.pptx', 'notes.txt', 'draft.doc'
]

JAM_MESSAGES = [
    '重要:プリンタで“{file}”が詰まりました。紙を手で給紙してください。',
    '警告:印刷待ちジョブが渋滞中。謎のトナーを補充してください。',
    'エラー:{file}の印刷中に紙詰まりが発生しました。プリンタカバーを開けてください。',
    '注意:プリンタが応答しません。紙を裏返して再度セットしてください。',
    '重大:印刷キューに未知の障害が発生しました。管理者に連絡してください。',
    '警告:プリンタメモリが溢れています。紙を一枚ずつ挿入してください。',
    'エラー:{file}の印刷でトナーが認識されません。純正トナーを装着してください。',
    '注意:プリンタが“{file}”の用紙サイズを判別できません。A4をセットしてください。',
    '重大:プリンタ内部で紙が迷子になりました。全てのカバーを開けて点検してください。',
    '警告:プリンタが“{file}”の印刷を拒否しました。再試行してください。'
]

LOG_FILE = os.path.expanduser('~/.fake_printer_jam_alert.log')


def random_message():
    file = random.choice(FAKE_FILES)
    msg = random.choice(JAM_MESSAGES)
    return msg.format(file=file)


def send_notification(msg):
    if OS_TYPE == 'windows' and notifier:
        notifier.show_toast('OS通知', msg, duration=8, threaded=True)
    elif OS_TYPE == 'mac':
        try:
            import pync
            pync.notify(msg, title='OS通知')
        except Exception:
            pass
    elif OS_TYPE == 'linux':
        try:
            import notify2
            n = notify2.Notification('OS通知', msg)
            n.set_timeout(8000)
            n.show()
        except Exception:
            pass
    else:
        print('[OS通知]', msg)


def log_notification(msg):
    now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    with open(LOG_FILE, 'a', encoding='utf-8') as f:
        f.write(f'[{now}] {msg}\n')


def random_interval(min_sec=90, max_sec=600):
    return random.randint(min_sec, max_sec)


def alert_loop(forever=True, count=0):
    sent = 0
    while forever or sent < count:
        wait = random_interval()
        time.sleep(wait)
        msg = random_message()
        send_notification(msg)
        log_notification(msg)
        sent += 1


def list_logs(lines=10):
    if not os.path.exists(LOG_FILE):
        print('ログが存在しません。')
        return
    with open(LOG_FILE, 'r', encoding='utf-8') as f:
        logs = f.readlines()
        for line in logs[-lines:]:
            print(line.strip())


def summary_logs():
    if not os.path.exists(LOG_FILE):
        print('ログが存在しません。')
        return
    with open(LOG_FILE, 'r', encoding='utf-8') as f:
        logs = f.readlines()
    print(f'通知回数: {len(logs)}')
    files = {}
    for l in logs:
        for fname in FAKE_FILES:
            if fname in l:
                files[fname] = files.get(fname, 0) + 1
    print('通知対象ファイルランキング:')
    for k, v in sorted(files.items(), key=lambda x: -x[1]):
        print(f'  {k}: {v}回')


def clear_logs():
    if os.path.exists(LOG_FILE):
        os.remove(LOG_FILE)
        print('ログを削除しました。')
    else:
        print('ログが存在しません。')


def main():
    parser = argparse.ArgumentParser(description='Fake OS Printer Jam Alert Skill')
    subparsers = parser.add_subparsers(dest='command')

    parser_run = subparsers.add_parser('run', help='ランダムなプリンタ紙詰まり通知を発生させる')
    parser_run.add_argument('--count', type=int, help='通知回数(指定しない場合は無限)')

    parser_list = subparsers.add_parser('list', help='直近の通知ログを表示')
    parser_list.add_argument('--lines', type=int, default=10, help='表示する行数')

    parser_summary = subparsers.add_parser('summary', help='通知ログのサマリを表示')
    parser_clear = subparsers.add_parser('clear', help='通知ログを削除')

    args = parser.parse_args()

    if args.command == 'run':
        if args.count:
            alert_loop(forever=False, count=args.count)
        else:
            try:
                alert_loop()
            except KeyboardInterrupt:
                print('\n終了します。')
    elif args.command == 'list':
        list_logs(lines=args.lines)
    elif args.command == 'summary':
        summary_logs()
    elif args.command == 'clear':
        clear_logs()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
本Skillは、ユーザーがプリンタを一切利用していない状況でも、完全にランダムなタイミングで理不尽なプリンタ紙詰まり通知を発生させることを目的としています。日常作業の合間に“紙詰まりあるある”を演出し、混乱やユーモアを提供します。

# 公式ドキュメント抜粋
- [win10toast (Windows通知)](https://pypi.org/project/win10toast/)
- [pync (macOS通知)](https://github.com/msanders/pync)
- [notify2 (Linux通知)](https://pypi.org/project/notify2/)

# 利用例
- ターミナルやデスクトップで作業中、突然「プリンタでmain.pyが詰まりました」などの通知が表示されます。
- 通知内容は毎回異なり、理不尽な指示や障害内容が含まれます。

# 注意点
- 実際のプリンタや印刷機能とは一切連携していません。
- 通知はローカルOSの通知APIを利用し、履歴はユーザーのホームディレクトリに保存されます。

# 設計方針
- OSごとに最適な通知APIを自動選択。
- 通知内容・タイミングは完全ランダム。
- ログ管理・サマリ機能も提供し、Skillの動作検証やネタ出力の確認が容易です。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/random-os-fake-printer-jam-alert .agent/skills/random-os-fake-printer-jam-alert

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

3. ファイル配置確認

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

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

新しいSkillが自動で認識されます。リスト確認したい場合は Antigravity に「使えるSkill一覧を見せて」と聞く と Skill 名で出てきます。

5. 動作確認

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

こんな瞬間に便利

  • session 開始時: 前回までの repo 把握を Antigravity に一発で復元させたい
  • monorepo 移動時: packages を跨いだ瞬間に context を切り替えたい
  • onboarding 時: 新しい repo を Antigravity に把握させ、こちらが 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 コードを拾ってしまう可能性
  • Antigravity 固有の引っかかり: description のセマンティックマッチ精度が要件次第
  • 発動しないケース: description が漠然 / 他の Skill が優先 / git管理外 directory

試す前に確かめたいこと

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

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

実際に Antigravity で試した検証ログは Antigravityで謎のプリンタ紙詰まり警告を体験してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。

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

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

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

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