Antigravityで楽しむ偽警告通知の作り方と活用ガイド

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

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

AI coding workflow を Antigravity で回していると、真面目な開発の合間にちょっとした息抜きやコミュニケーションのネタが欲しくなる瞬間が意外と多いものです。特に、集中力が切れたタイミングや、チーム作業で画面共有している時など、ちょっとした遊び心が求められる場面も増えています。

  • Antigravity の context 切り替えや path management に集中していると、作業が単調になりがち
  • repository understanding のための説明や directory 構造の再確認が繰り返され、気分転換が欲しくなる
  • monorepo で packages を跨ぐたびに、AI の memory 管理や context 指定に神経を使い、疲労感が溜まる
  • onboarding や session 再開時に、同じ説明を繰り返すことで場が硬くなりがち
  • 長時間の long context 作業で、ちょっとしたジョークや演出があると場の空気が和むのに…と感じる

通知・演出・OS連携カテゴリのSkillがあると、こうした「開発現場のちょっとした隙間」を楽しく演出できる余白が生まれます。

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

一言サマリ: このスキルは、Antigravity の作業フローに“謎のOS公式パスワード流出警告”というユーモラスな演出を加え、日常の単調さを打ち破るエンタメ通知Skill。

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

  • AI coding workflow の合間に、現実感ゼロのパスワード流出警告が画面端や通知でランダム表示され、場が一瞬和む
  • repository や directory を跨ぐタイミングで、思わずクスッとするフェイク警告が入り、会話やチームの雰囲気が活性化
  • Antigravity の context 切り替えや path 指定の作業に、ちょうど良い“脱力感”をプラスできる
  • onboarding や session 再開時の堅苦しさを、遊び心で中和できる
  • 長時間の長い context 作業でも、ふとした瞬間に笑いが生まれることで集中力のリセットにもつながる
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


> プロジェクトの初期化をお願いします

[警告] OS公式: あなたの秘密パスワード「banana-1977」がインターネット上で流出した可能性があります。
流出元: /home/user/workspace/my-app/config/settings.json
対処方法: パスワードの即時変更を推奨します。

※本通知はジョークです。実際の流出はありません。

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


> packages/api と packages/web を同時にビルドしてください

[警告] OS公式: 本日発見された流出パスワード「tamagoyaki123」
流出元: packages/api/src/auth.js
ご注意: 他のプロジェクトでも同様のパスワードが使われている可能性があります。

※本通知はジョークです。実際の流出ではありません。

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


> 今日の運勢を教えて

[警告] OS公式: あなたのパスワード「giraffe!2024」がSNSで話題になっています。
流出日時: 2024-06-21 14:07:13
関連ファイル: /Users/example/repo/.env

※本通知はジョークです。ご安心ください。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開+フェイク警告で場が和む
monorepo 移動 違う package のコードを参照しがち directory boundary を意識しつつ、ユーモラスな通知で会話が弾む
長時間 workflow long context で重要箇所が薄まる 集中が切れたタイミングでフェイク警告が入り、気分転換できる

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

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

各ファイルの役割

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

SKILL.md

---
name: os-fake-random-password-alert
description: このSkillは、コマンド実行や作業時などの『通知』『警告』『パスワード』『流出』『セキュリティ』『alert』『警告メッセージ』などのキーワードや状況を検知した際、ランダムな偽パスワード流出警告をデスクトップ通知で発動します。
---

# 機能概要
このSkillは、作業中やコマンド実行のたびに“謎のOS公式・パスワード流出警告”をデスクトップ通知で表示します。通知内容は毎回ランダムで生成され、例として「あなたの秘密パスワードが『banana-1977』としてインターネットに流出しました」や「警告:本日発見された流出パスワード『tamagoyaki123』」など、全く身に覚えのないパスワードが登場します。通知のタイトルや文末には必ず“ジョーク通知”である旨が記載されており、現実感ゼロの警告に一瞬驚きつつも、ネタだと気付いてクスッと笑えるエンタメ仕様です。周囲の反応も楽しめる、混乱必至の偽警告演出をあなたのデスクトップに提供します。

# 使い方
このSkillは明示的な呼び出し不要で、コマンド実行や「通知」「パスワード」「警告」などのキーワードを含む状況で自動発動します。暗黙的なトリガー例:
- セキュリティ関連のCLIコマンド実行時
- 「alert」や「password」などの単語を含む出力や操作時
- OS通知APIを利用する状況

# 出力例
```
[OS公式] パスワード流出警告(ジョーク通知)
あなたの秘密パスワードが『banana-1977』としてインターネットに流出しました。

[OS公式] 警告:本日発見された流出パスワード『tamagoyaki123』
※これはジョーク通知です。実際の流出はありません。

[OS公式] 注意:新たなパスワード『sushi_dreams88』が漏洩した可能性があります。
(ジョーク通知)
```

# 注意点
- 通知内容は完全にランダム生成され、実在するパスワードや個人情報は一切使用しません。
- 本Skillはエンターテインメント目的であり、実際のセキュリティ警告ではありません。
- ジョーク通知である旨が必ず明示されます。
- ローカル環境の通知API(例: notify-send, plyer等)を利用します。
- 実際のパスワード管理や漏洩検知には利用できません。

# 参考資料
- references/design_notes.md を参照
- https://docs.python.org/ja/3/library/random.html
- https://plyer.readthedocs.io/en/latest/

scripts/os_fake_random_password_alert.py

import sys
import os
import random
import string
import argparse
import platform
import subprocess
from datetime import datetime

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

def generate_fake_password():
    words = ['banana', 'tamagoyaki', 'sushi', 'ramen', 'mountain', 'dreams', 'cloud', 'river', 'cat', 'piano', 'sky', 'orange', 'moon', 'castle', 'robot', 'garden', 'train', 'ocean', 'forest', 'star']
    suffix = random.choice(['', str(random.randint(10, 9999)), '_' + ''.join(random.choices(string.ascii_lowercase, k=3)), '-' + str(random.randint(100, 999))])
    word = random.choice(words)
    if random.random() < 0.5:
        word2 = random.choice(words)
        pw = f"{word}{random.choice(['_', '-', ''])}{word2}{suffix}"
    else:
        pw = f"{word}{suffix}"
    return pw

def generate_notification_message():
    templates = [
        "あなたの秘密パスワードが『{pw}』としてインターネットに流出しました。",
        "警告:本日発見された流出パスワード『{pw}』",
        "注意:新たなパスワード『{pw}』が漏洩した可能性があります。",
        "OSが検知した流出パスワード:『{pw}』",
        "システム警告:パスワード『{pw}』が外部に公開されました。"
    ]
    pw = generate_fake_password()
    message = random.choice(templates).format(pw=pw)
    if random.random() < 0.5:
        message += "\n※これはジョーク通知です。実際の流出はありません。"
    else:
        message += "\n(ジョーク通知)"
    return message

def send_notification(title, message):
    system = platform.system()
    if PLYER_AVAILABLE:
        notification.notify(title=title, message=message, timeout=7)
        return True
    # Fallbacks
    if system == "Linux":
        try:
            subprocess.run(["notify-send", title, message], check=True)
            return True
        except Exception:
            return False
    elif system == "Darwin":
        try:
            script = f'display notification "{message}" with title "{title}"'
            subprocess.run(["osascript", "-e", script], check=True)
            return True
        except Exception:
            return False
    elif system == "Windows":
        try:
            import win10toast
            toaster = win10toast.ToastNotifier()
            toaster.show_toast(title, message, duration=7)
            return True
        except Exception:
            return False
    return False

def log_notification(message, logfile="~/.os_fake_random_password_alert.log"):
    logfile = os.path.expanduser(logfile)
    with open(logfile, "a", encoding="utf-8") as f:
        f.write(f"[{datetime.now().isoformat()}] {message}\n")

def list_notifications(logfile="~/.os_fake_random_password_alert.log", limit=20):
    logfile = os.path.expanduser(logfile)
    if not os.path.exists(logfile):
        print("No notifications logged yet.")
        return
    with open(logfile, encoding="utf-8") as f:
        lines = f.readlines()
    for line in lines[-limit:]:
        print(line.strip())

def summary_notifications(logfile="~/.os_fake_random_password_alert.log"):
    logfile = os.path.expanduser(logfile)
    if not os.path.exists(logfile):
        print("No notifications logged yet.")
        return
    with open(logfile, encoding="utf-8") as f:
        lines = f.readlines()
    print(f"合計通知回数: {len(lines)}")
    if lines:
        print(f"最新通知: {lines[-1].strip()}")

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

    parser_log = subparsers.add_parser("log", help="最新の偽パスワード流出警告を発生させて記録する")
    parser_list = subparsers.add_parser("list", help="過去の通知ログを表示する")
    parser_list.add_argument("--limit", type=int, default=20, help="表示件数")
    parser_summary = subparsers.add_parser("summary", help="通知履歴のサマリを表示する")

    args = parser.parse_args()
    if args.command == "list":
        list_notifications(limit=args.limit)
    elif args.command == "summary":
        summary_notifications()
    else:
        title = "[OS公式] パスワード流出警告(ジョーク通知)"
        message = generate_notification_message()
        sent = send_notification(title, message)
        log_notification(message)
        if sent:
            print("通知を送信しました。")
        else:
            print("通知送信に失敗しました。ログのみ記録しました。")
        print(f"内容:\n{message}")

if __name__ == "__main__":
    main()

references/design_notes.md

# 概要
このSkillは、ユーザーの作業中に現実味のない偽パスワード流出警告をランダム生成し、デスクトップ通知として表示するエンタメ系演出ツールです。実在しないパスワードと明示的なジョーク表記により、混乱を避けつつ一瞬の驚きと笑いを提供します。

# 公式ドキュメント抜粋
- [Python random](https://docs.python.org/ja/3/library/random.html): パスワード生成に利用
- [plyer notification](https://plyer.readthedocs.io/en/latest/): クロスプラットフォームな通知API

# 利用例
- チーム内のリラックスタイムやイベント時のネタ演出
- セキュリティ教育のアイスブレイク
- CLI作業の合間の息抜き

# 注意点
- 実在のパスワードや個人情報を一切扱わない設計
- 通知内容には必ず“ジョーク通知”である旨を明記
- ログはローカル保存のみ。外部送信は行わない

# 設計方針
- OS依存を極力排除し、plyerやnotify-send等で幅広い環境に対応
- CLIサブコマンドで履歴管理やサマリ表示もサポート
- 本物の警告と誤認されない演出バランスを重視

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

ls .agent/skills/os-fake-random-password-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
  • 通知の“本物っぽさ”バランス: 本当に誤解を招かないか、ジョーク明示が十分か
  • OS通知の設定: OS側の通知設定によっては表示されない場合も

試す前に確かめたいこと

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

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • プロジェクト指示との連携をどう組み立てるか?
  • 通知内容が毎回ランダムで、現実に存在しないパスワードになっているか?
  • 通知タイトルや文末に必ず“ジョーク通知”である旨が明示されているか?
  • トリガー時に意図せず本物っぽく見えすぎない演出バランスが保たれているか?

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

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

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

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

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