Antigravityで突然の謎通知を自動化して職場の緊張を和らげる方法

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

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

AI coding workflow を日常化している現場では、Antigravity の「通知・演出」系 Skill の活用ニーズが意外と高まっています。特にリポジトリの context 管理や、directory 構造の把握に集中していると、単調な作業が続きがちです。その一方で、突発的なイベントやユーモアが介在することで、チームの空気が和らいだり、気分転換に繋がる場面も少なくありません。
Antigravity の repository understanding 機能や path management の精度に期待する一方、日々の開発で以下のような悩みに直面しがちです。

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

こうした「真面目な作業の連続」に、時には意図的なカオスや非日常が欲しくなる瞬間も。通知・演出・OS連携系の Skill で、現場の空気を一瞬リフレッシュしたいという声も増えています。

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

一言サマリ: このスキルは、Antigravity の日常的な開発フローに“謎のOSロックダウン通知”という非日常を持ち込み、作業現場に突発的な笑いと混乱を演出します。

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

  • 単調になりがちな長時間のAI coding workflowやonboarding時に、カオスな通知で場の空気を一瞬リセットできる
  • repository understanding や context 管理に没頭しがちな現場で、意図的な“非現実”イベントを挿入できる
  • monorepo の複雑な directory や path management の合間に、緊張感をほぐす効果が期待できる
  • Antigravity の通知・演出 Skill を活用し、チームのコミュニケーションを活性化できる
  • 実ファイルや環境には一切影響を与えず、メモリやcontextを汚さずに“OS風”イベントを体験できる
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


# session start
> 新しいプロジェクトのリポジトリを読み込んで

[通知] 緊急:本日より全ファイル凍結
理由:カフェイン過剰摂取検知
影響範囲:/src, /config, /README.md
解除方法:深呼吸5回の後、再度リトライしてください

(※この通知はOSからの自律的なロックダウン警告です)

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


> packages/api から packages/web に移動してコード生成して

[警告] OSロックダウン発令:パッケージ境界違反が検出されました
理由:同時に2つ以上のpackageディレクトリを編集しようとしています
影響範囲:/packages/api, /packages/web
解除方法:一度コーヒーを置いて、目を閉じてください

(この通知はランダムイベントです。実ファイルには影響ありません)

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


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

[通知] 緊急:AIによる自動ロックダウン発動
理由:集中力が限界値を超えました
影響範囲:/docs, /scripts, /tests
解除方法:5秒間、画面から目を離してください

(この通知は完全にフェイクです。安心して作業を続けてください)

before / after の違い

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

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-fake-lockdown-alert/
├── SKILL.md
├── scripts/
│   └── random_os_fake_lockdown_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-lockdown-alert
description: このSkillは、作業中や長時間のコーディング、集中状態、または“ロックダウン”“警告”“通知”などのキーワードが会話やログに現れた際に自動発動し、ユーザーに対して完全ランダムな架空のOSロックダウン警告を表示します。
---

# 機能概要
random-os-fake-lockdown-alertは、作業環境に突如として「OSロックダウン発令」風の通知を表示する演出系Skillです。通知内容は毎回ランダム生成され、現実にはありえない理由や解除方法が表示されます。これにより、真面目な作業現場や集中したコーディングセッションに一瞬の混乱と笑いをもたらし、チーム内の空気を和ませることができます。実際のファイルやシステムには一切影響を与えません。

# 使い方
このSkillは明示的な呼び出しは不要です。以下のような状況やキーワードが検出された際に自動発動します:
- 「ロックダウン」「警告」「システム障害」「緊急」などの語が会話やログに出現
- 長時間の作業や集中状態が継続
- ターミナルやデスクトップでのアクティビティが一定時間続く

# 出力例
```
[ALERT] OS Lockdown Activated!
理由: カフェイン過剰摂取が検出されました。
影響範囲: 全ファイルが一時的に凍結されます。
解除方法: 深呼吸を5回行ってください。
---
[ALERT] OS Lockdown Alert!
理由: キーボードの連打速度が異常値に到達。
影響範囲: デスクトップ全体が保護モードに移行。
解除方法: 画面に向かって「ごめんなさい」と唱える。
```

# 注意点
- 本Skillは通知のみを行い、実際のファイルやシステム設定には一切変更を加えません。
- 通知はローカル上にのみ表示され、ログやファイル保存は行いません。
- システム通知APIや標準出力のみを利用し、外部への情報送信はありません。
- 業務上の重要な警告と混同しないようご注意ください。

# 参考資料
設計方針や利用例の詳細は references/design_notes.md を参照してください。公式の通知API仕様については https://docs.python.org/ja/3/library/subprocess.html および https://pypi.org/project/plyer/ をご覧ください。

scripts/random_os_fake_lockdown_alert.py

import sys
import random
import time
import argparse
import platform
import subprocess
from typing import List

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

REASONS = [
    "カフェイン過剰摂取が検出されました。",
    "キーボードの連打速度が異常値に到達。",
    "OSが自律的ストライキを開始しました。",
    "AIによる人間観察モードが有効化されました。",
    "ディスプレイの明るさが許容範囲を超過。",
    "マウスの移動距離が本日規定値を突破。",
    "不明なUSBデバイスが検出されました。",
    "仮想メモリがジョークモードに移行。",
    "無意識のうちにF5キーを30回連打。",
    "システムが突然の休憩を要求しています。"
]

IMPACTS = [
    "全ファイルが一時的に凍結されます。",
    "デスクトップ全体が保護モードに移行。",
    "ネットワーク通信がランダム化されます。",
    "ターミナルが詩的モードに切り替わります。",
    "全ウィンドウが90秒間逆さ表示。",
    "マウスポインタが自動で逃走します。",
    "クリップボードが自動消去されます。",
    "仮想メモリがリラックス状態に。",
    "全アプリが一時的に沈黙モード。",
    "ファイル名がランダムにシャッフル。"
]

UNLOCKS = [
    "深呼吸を5回行ってください。",
    "画面に向かって『ごめんなさい』と唱える。",
    "コーヒーを一杯減らしてください。",
    "椅子から立ち上がってストレッチ。",
    "30秒間目を閉じてリラックス。",
    "好きな歌を一小節口ずさむ。",
    "手を振ってOSに挨拶する。",
    "デスクトップのアイコンを一つ動かす。",
    "同僚に『今日は最高』と伝える。",
    "5回ジャンプする。"
]

ALERT_TITLES = [
    "OS Lockdown Activated!",
    "OS Lockdown Alert!",
    "緊急: ロックダウン通知",
    "[ALERT] システム制限発動",
    "システム警告: ロックダウン"
]


def random_alert() -> dict:
    title = random.choice(ALERT_TITLES)
    reason = random.choice(REASONS)
    impact = random.choice(IMPACTS)
    unlock = random.choice(UNLOCKS)
    return {
        "title": title,
        "reason": reason,
        "impact": impact,
        "unlock": unlock
    }

def print_alert(alert: dict):
    print(f"[{alert['title']}]\n理由: {alert['reason']}\n影響範囲: {alert['impact']}\n解除方法: {alert['unlock']}")

def notify_desktop(alert: dict):
    message = f"理由: {alert['reason']}\n影響範囲: {alert['impact']}\n解除方法: {alert['unlock']}"
    if PLYER_AVAILABLE:
        notification.notify(title=alert['title'], message=message, app_name="FakeLockdownAlert", timeout=8)
    else:
        system = platform.system()
        if system == "Darwin":
            subprocess.call(["osascript", "-e", f'display notification "{message}" with title "{alert["title"]}"'])
        elif system == "Linux":
            subprocess.call(["notify-send", alert['title'], message])
        elif system == "Windows":
            # Windows 10+ 用の通知 (PowerShell)
            try:
                import win10toast
                toaster = win10toast.ToastNotifier()
                toaster.show_toast(alert['title'], message, duration=8)
            except ImportError:
                print_alert(alert)
        else:
            print_alert(alert)

def run_random_alert(mode: str = "both"):
    alert = random_alert()
    if mode == "print":
        print_alert(alert)
    elif mode == "notify":
        notify_desktop(alert)
    else:
        print_alert(alert)
        notify_desktop(alert)

def schedule_alerts(interval_min: int, count: int, mode: str):
    for i in range(count):
        run_random_alert(mode)
        if i < count - 1:
            time.sleep(interval_min * 60)

def list_samples(num: int = 5):
    for _ in range(num):
        alert = random_alert()
        print_alert(alert)
        print("---")

def main():
    parser = argparse.ArgumentParser(description="Random OS Fake Lockdown Alert Skill")
    subparsers = parser.add_subparsers(dest="command")

    parser_once = subparsers.add_parser("once", help="1回だけランダム警告を出す")
    parser_once.add_argument("--mode", choices=["print", "notify", "both"], default="both", help="出力方法 (print/notify/both)")

    parser_schedule = subparsers.add_parser("schedule", help="一定間隔で複数回警告を出す")
    parser_schedule.add_argument("--interval", type=int, default=30, help="警告間隔(分)")
    parser_schedule.add_argument("--count", type=int, default=3, help="警告回数")
    parser_schedule.add_argument("--mode", choices=["print", "notify", "both"], default="both", help="出力方法")

    parser_list = subparsers.add_parser("list", help="サンプル警告をまとめて表示")
    parser_list.add_argument("--num", type=int, default=5, help="サンプル数")

    args = parser.parse_args()

    if args.command == "once":
        run_random_alert(args.mode)
    elif args.command == "schedule":
        schedule_alerts(args.interval, args.count, args.mode)
    elif args.command == "list":
        list_samples(args.num)
    else:
        parser.print_help()

if __name__ == "__main__":
    main()

references/design_notes.md

# 概要
このSkillは、作業現場や開発チームに一瞬の“非日常”をもたらすための演出系ツールです。実際のファイルやシステムには全く影響せず、通知内容も完全に架空でユーモラスなものとなっています。

# 公式ドキュメント抜粋
通知表示には plyer (https://pypi.org/project/plyer/) の notification APIを優先利用し、未導入環境ではOS標準の通知コマンド(macOS: osascript, Linux: notify-send, Windows: win10toast等)を自動判別して使用します。

# 利用例
- チームの朝会や休憩前に“謎のロックダウン”を発動し、場を和ませる
- 長時間作業の合間に自動発動させてリフレッシュを促す
- オンライン会議中のアイスブレイク用途

# 注意点
- 本Skillは通知のみで、実際のファイルやシステム設定には一切アクセスしません
- 業務上の本物の警告や障害通知と混同しないよう、運用時は事前説明を推奨します

# 設計方針
完全ランダムなメッセージ生成と、OS依存性を極力排除したクロスプラットフォーム設計を重視しています。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

ls .agent/skills/random-os-fake-lockdown-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をコピーしました!
目次