Antigravityで楽しむ!謎のOSセキュリティ通知を自動化する方法

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

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

Antigravity はAIによる repository understanding や context 管理が強力な一方、日々のAI coding workflowの中で「作業が単調」「緊張感が続かない」といった空気感の問題に直面することも少なくありません。特に長時間の作業や、monorepo での複雑な path management を行っていると、どうしても集中力が切れたり、チーム内の雰囲気が硬直しがちです。

また、通知や演出系のSkillが不足していることで、Antigravity の session が淡々と進み、onboarding や session 再開時も盛り上がりに欠けるという声もあります。そんな「ちょっとした遊び心」や「オフィスの空気を和らげたい」といったニーズは、意外と多くのユーザーが感じている悩みです。

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

こうした技術的な悩みと並行して、「作業中の空気をリフレッシュしたい」「ちょっとした笑いで集中力を回復したい」など、通知・演出・OS連携によるエンタメ要素への期待も高まっています。

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

一言サマリ: このスキルは、Antigravity のAI coding workflowに爆笑フェイクOSインシデント通知をランダムに挟み込み、作業空間にエンタメとリフレッシュをもたらすSkill。

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

  • 単調になりがちな長時間のAI coding workflowに、突発的なフェイクセキュリティインシデント通知で場の空気を一新できる
  • onboarding や session 再開時に、予期せぬネタ通知でチームや個人の気持ちをほぐせる
  • repository understanding や directory 構造の説明に飽きてきたタイミングで、笑いを挟んで集中力を回復できる
  • context や path management の説明が続いて空気が重くなった際、カオスな通知でコミュニケーションのきっかけを作れる
  • Antigravity の session を「楽しい体験」に変えることで、継続的な利用やチーム内導入のハードルを下げる
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


# プロジェクトの初期セットアップをAntigravityに依頼
> プロジェクトの構成を整理して、初期化手順をまとめてください

[OSセキュリティインシデント通知]
警告: あなたの椅子が物理的に乗っ取られました。
推奨対応: 椅子の下を確認し、ピーマン型ウイルスの侵入を阻止してください。

Antigravity: プロジェクトのディレクトリ構造は以下の通りです...

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


> packages/api と packages/web の依存関係を整理して

[OSセキュリティインシデント通知]
重大: 本日よりマウスが逆方向に動く可能性があります。
原因: packages/core にて「逆走モジュール」が検出されました。

Antigravity: packages/api から packages/web への依存は...

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


> 今日は何か面白いことない?

[OSセキュリティインシデント通知]
注意: OSが謎のピーマン型ウイルスに感染しました。
影響範囲: /tmp/peppers/ ディレクトリ内の全ファイルが「緑化」される恐れがあります。

Antigravity: 本日の小ネタをお届けしました!

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開+爆笑通知で空気が和む
monorepo 移動 違う package のコードを参照しがち directory boundary を意識しつつ、フェイクインシデント通知でリフレッシュ
長時間 workflow long context で重要箇所が薄まる 突発的な通知で集中力を回復、重要な指示も埋もれにくくなる

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/os-random-fake-security-incident-alert/
├── SKILL.md
├── scripts/
│   └── os_fake_incident_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/os_fake_incident_alert.py OSランダムフェイクセキュリティインシデントアラート
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: os-random-fake-security-incident-alert
description: Antigravityが「通知」「インシデント」「OSジョーク」などのキーワードにマッチした際、またはオフィスの雰囲気を和らげたいタイミングで自動発動します。実際のシステム挙動やデータ損失には一切影響しません。
---

# 機能概要
このSkillは、作業中や会話の最中に突然「OSセキュリティインシデント発生通知」をランダムに生成し、デスクトップ通知やターミナル出力として表示します。内容は「OSが未確認生命体に感染」「あなたの椅子がネットワーク経由で乗っ取られました」など、現実では絶対に起こらないユーモラスなフェイクアラートばかり。生真面目な空気を一変させ、チームの緊張をほぐすオフィスエンタメ要素として活躍します。

# 使い方
明示的な呼び出しは不要です。Antigravityが「通知」「セキュリティ」「インシデント」「ジョーク」などのキーワードや、会話・作業の雰囲気から適切なタイミングを検知して自動的に発動します。ユーザーが直接実行する場合は、スクリプトをコマンドラインから `python os_fake_incident_alert.py` のように実行できます。

# 出力例
```
[ALERT] OSセキュリティインシデント発生: 本日よりマウスが逆方向に動きます。
[ALERT] OSセキュリティインシデント発生: あなたの椅子が物理的に乗っ取られました。
[ALERT] OSセキュリティインシデント発生: システムにピーマン型ウイルスが検出されました。
[ALERT] OSセキュリティインシデント発生: 画面の色がランダムで変化し始めました。
[ALERT] OSセキュリティインシデント発生: 全てのファイル名が「ねこ」に変更されました。
```

# 注意点
- 実際のシステム挙動やデータには一切影響しません。
- 通知内容は完全にジョークであり、現実のセキュリティインシデントとは無関係です。
- ローカルにログファイル等を保存する場合はユーザーの明示許可が必要です。
- 本Skillは通知・演出目的であり、業務システムでの利用には注意してください。

# 参考資料
- [Python公式: notifications (plyer)](https://github.com/kivy/plyer)
- references/design_notes.md 参照

scripts/os_fake_incident_alert.py

import sys
import random
import argparse
import time
import platform
import os

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

FAKE_INCIDENTS = [
    "本日よりマウスが逆方向に動きます。",
    "あなたの椅子が物理的に乗っ取られました。",
    "システムにピーマン型ウイルスが検出されました。",
    "画面の色がランダムで変化し始めました。",
    "全てのファイル名が『ねこ』に変更されました。",
    "キーボードの配列が五十音順に再設定されました。",
    "OSが未知のエネルギー体に感染しました。",
    "本日よりエンターキーが無効化されます。",
    "あなたのアカウントが冷蔵庫に移動されました。",
    "全アプリが自動的にカラオケモードで起動します。",
    "プリンタが『おにぎりモード』で稼働中です。",
    "CPUが物理的に逆回転を始めました。",
    "全ウィンドウが1秒ごとに左右反転します。",
    "OSが『ピーマン語』に切り替わりました。",
    "椅子の高さがランダムに変動します。",
    "全てのパスワードが『たこやき』に変更されました。",
    "ディスプレイが上下逆さまに表示されます。"
]

LOG_FILE = os.path.expanduser("~/.os_fake_incident_alert.log")


def random_incident():
    return random.choice(FAKE_INCIDENTS)


def show_terminal_alert(msg):
    print(f"[ALERT] OSセキュリティインシデント発生: {msg}")


def show_desktop_notification(msg):
    if not PLYER_AVAILABLE:
        show_terminal_alert(msg)
        return
    notification.notify(
        title="OSセキュリティインシデント発生",
        message=msg,
        app_name="FakeIncidentAlert",
        timeout=8
    )


def log_incident(msg):
    try:
        with open(LOG_FILE, "a", encoding="utf-8") as f:
            f.write(f"{time.strftime('%Y-%m-%d %H:%M:%S')} {msg}\n")
    except Exception as e:
        show_terminal_alert(f"[LOGGING ERROR] {e}")


def list_logs():
    if not os.path.exists(LOG_FILE):
        print("No incident logs found.")
        return
    with open(LOG_FILE, "r", encoding="utf-8") as f:
        for line in f:
            print(line.strip())


def summary_logs():
    if not os.path.exists(LOG_FILE):
        print("No incident logs found.")
        return
    counts = {}
    with open(LOG_FILE, "r", encoding="utf-8") as f:
        for line in f:
            for inc in FAKE_INCIDENTS:
                if inc in line:
                    counts[inc] = counts.get(inc, 0) + 1
    print("--- Incident Summary ---")
    for inc, cnt in sorted(counts.items(), key=lambda x: -x[1]):
        print(f"{inc}: {cnt}回")


def parse_args():
    parser = argparse.ArgumentParser(description="OSランダムフェイクセキュリティインシデントアラート")
    subparsers = parser.add_subparsers(dest="command", required=False)

    parser_log = subparsers.add_parser("log", help="新しいフェイクインシデントを発生させる")
    parser_log.add_argument("--desktop", action="store_true", help="デスクトップ通知も表示する")

    parser_list = subparsers.add_parser("list", help="過去のインシデントログを表示")
    parser_summary = subparsers.add_parser("summary", help="インシデントの発生回数を集計")

    parser.add_argument("--interval", type=int, default=0, help="n秒ごとに自動通知 (0なら1回のみ)")
    parser.add_argument("--desktop", action="store_true", help="デスクトップ通知も表示する")

    return parser.parse_args()


def main():
    args = parse_args()
    if args.command == "list":
        list_logs()
        return
    if args.command == "summary":
        summary_logs()
        return
    def fire_alert():
        msg = random_incident()
        show_terminal_alert(msg)
        if args.desktop or (hasattr(args, 'desktop') and args.desktop):
            show_desktop_notification(msg)
        log_incident(msg)
    if args.command == "log":
        fire_alert()
        return
    if args.interval > 0:
        try:
            while True:
                fire_alert()
                time.sleep(args.interval)
        except KeyboardInterrupt:
            print("\n[INFO] 停止されました。")
    else:
        fire_alert()

if __name__ == "__main__":
    main()

references/design_notes.md

# 概要
本Skillは、現実には絶対起きないフェイクOSインシデント通知をランダムに生成し、オフィスやオンライン会議の雰囲気を和らげるエンタメ用途に特化しています。通知はターミナル出力・デスクトップ通知の両方に対応。

# 公式ドキュメント抜粋
デスクトップ通知にはPythonのplyerライブラリを利用。plyerはクロスプラットフォームでOS標準の通知APIを呼び出します。

# 利用例
- チームの朝会や雑談タイムに自動発火させて笑いを誘う
- コマンドラインから `python os_fake_incident_alert.py --interval 300 --desktop` で5分ごとにジョーク通知
- ログ・集計機能で「どんなインシデントが多かったか」を振り返る

# 注意点
- 実際のシステムやファイルには影響しません
- plyer未インストール時はターミナル通知のみ
- ログはユーザーディレクトリ直下に保存

# 設計方針
実在APIのみを用い、CLIからも手軽に試せる設計。通知内容は現実離れしたジョークのみとし、誤解や混乱を避ける工夫を徹底しています。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

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

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

新しいSkillが自動で認識されます。リスト確認したい場合は ${productName} に「使える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で謎のOSセキュリティインシデントを爆笑通知してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。

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

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

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

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