Antigravityで謎のライセンス違反通知を楽しむ意外な活用法

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

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

Antigravity を使った AI coding workflow では、プロジェクト規模や作業セッションの長さに比例して context 管理や repository understanding にまつわる悩みが増えがちです。特に monorepo や複数 directory 構成の repository だと、path management の煩雑さや、AI の記憶に依存した onboarding の難しさが目立ちます。
一方で、真面目な開発現場が続くと、作業の合間にちょっとした息抜きや、チームの雰囲気を和ませる演出が欲しくなる瞬間もあります。通知・演出・OS連携系の Skill で「場の空気」を変えたい、そんなニーズも意外と根強いものです。

  • Antigravity が context を見失い、全く関係ない directory のコードを参照してしまう
  • monorepo で package を跨いだ瞬間、repository 構造を再説明しないと path 管理が破綻する
  • session を再開するたび、前回までの memory や重要な directory 情報を毎回初期化し直す羽目になる
  • 長時間の AI coding workflow で long context が膨張し、重要な repository understanding が薄まる
  • 真面目な雰囲気ばかりで、たまには場を和ませるジョーク的な通知や演出が欲しい

こうした悩みを持つ開発者にとって、「ちょっとした遊び心」を加える Skill の存在は、意外と大きな価値を持ちます。

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

一言サマリ: このスキルは、Antigravity の作業中に“謎のOSライセンス違反警告”をランダムなタイミングでデスクトップ通知として表示し、真面目な開発現場にユーモアをもたらす Skill。

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

  • AI coding workflow の合間に、思わず二度見するようなユニークな警告通知で場の空気が和らぐ
  • repository や directory 構造、path 管理に疲れたとき、気分転換になる演出を自動で挟める
  • monorepo での package 跨ぎや session 再開時など、集中力が途切れがちなタイミングで軽いジョークが入る
  • Antigravity の通知・演出・OS連携 Skill の活用例として、onboarding 時のアイスブレイクにも使える
  • 長時間の long context 作業で stale context を感じたとき、意図的にリフレッシュを促す演出になる
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


> プロジェクトのセットアップを始めたい

[通知] [OSライセンス違反警告]
あなたの椅子が「座りすぎライセンス」に抵触しました。
違反コード: CHAIR-OVERUSE-042
対応策: 立ち上がってストレッチを推奨します。

[Antigravity] context: repo 構造を解析中...

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


> packages/api/ と packages/web/ 両方の構成を説明して

[通知] [OSライセンス違反警告]
「コーヒーブレイク無許可利用」を検出しました。
違反コード: COFFEE-UNLICENSED-007
対応策: 公式休憩申請フォームをご利用ください。

[Antigravity] directory: packages/api/, packages/web/ の context を切り替えます

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


> 今日は集中できないので何か面白いことをして

[通知] [OSライセンス違反警告]
「謎のキーボード配列違反」が発生しました。
違反コード: KEYBOARD-UNKNOWN-314
対応策: 配列をランダムに変更...(嘘です)

[Antigravity] memory: 気分転換モードを一時的に有効化

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開。さらに謎通知で和みもプラス
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る。package 跨ぎでジョーク通知が入る
長時間 workflow long context で重要箇所が薄まる 集中力が切れそうなタイミングで警告通知が入り、リフレッシュのきっかけになる

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-fake-license-violation-alert/
├── SKILL.md
├── scripts/
│   └── random_os_fake_license_violation_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_fake_license_violation_alert.py 謎のOSライセンス違反警告をランダムに通知します。ジョーク用途のみ。
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-license-violation-alert
description: 作業中やコーディング時に、Antigravityが“ライセンス違反”や“謎の警告”などのキーワードを検出した場合、または雰囲気を和ませたい場面で自動的に発動します。通知・警告・OS・違反・ジョークなどの語が含まれる場合に最適です。
---

# 機能概要
このSkillは、作業中に突然“謎のOSライセンス違反警告”をデスクトップ通知で表示するジョーク系演出ツールです。警告内容は毎回ランダム生成され、「椅子の座りすぎライセンス違反」「未認可コーヒーブレイク」「謎のキーボード配列違反」など、実際には存在しない意味不明な違反ばかり。真面目な雰囲気を一瞬で和ませたり、会議やペアプロの場で笑いを誘うことができます。

# 使い方
本Skillは明示的な呼び出しを必要とせず、Antigravityが「通知」「警告」「ライセンス」「違反」「ジョーク」などのキーワードや、雰囲気を和ませたい文脈を検出した場合に自動で発動します。明示呼び出しは不要ですが、ローカルでスクリプトを直接実行することも可能です。

# 出力例
```
[通知] OSライセンス違反警告: あなたの椅子、座りすぎライセンス違反が検出されました。直ちに立ち上がってください。
[通知] OSライセンス違反警告: コーヒーブレイク無許可利用を検出。管理者に連絡してください。
[通知] OSライセンス違反警告: 謎のキーボード配列違反が発生しました。
[通知] OSライセンス違反警告: マウスクリック過多による操作制限違反。
[通知] OSライセンス違反警告: 未登録のUSBデバイスが検出されました(実は嘘です)。
```

# 注意点
本Skillは完全なジョーク用途であり、実際のシステム警告やライセンス違反とは一切関係ありません。通知内容はすべてランダム生成され、システムに変更を加えたり記録を残すことはありません。実際の業務環境で誤解を招かないよう、利用シーンにはご注意ください。

# 参考資料
- references/design_notes.md
- 公式: https://docs.python.org/3/library/subprocess.html, https://plyer.readthedocs.io/en/latest/

scripts/random_os_fake_license_violation_alert.py

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

try:
    from plyer import notification
except ImportError:
    notification = None
    
ALERT_TEMPLATES = [
    "あなたの椅子、座りすぎライセンス違反が検出されました。直ちに立ち上がってください。",
    "コーヒーブレイク無許可利用を検出。管理者に連絡してください。",
    "謎のキーボード配列違反が発生しました。",
    "マウスクリック過多による操作制限違反。",
    "未登録のUSBデバイスが検出されました(実は嘘です)。",
    "ディスプレイ注視時間が規定値を超過しました。目を休めてください。",
    "OSライセンス:ペット写真閲覧権限がありません。",
    "未認可の深夜作業違反を検出しました。",
    "コードレビュー未提出ライセンス違反。",
    "マウスホイール逆回転違反。",
    "エアコン温度設定違反。",
    "仮想デスクトップ過剰利用違反。",
    "未登録Bluetoothデバイス接続違反。",
    "未許可のコピペ操作違反。",
    "OSライセンス:机の上のコップ放置違反。"
]

LOG_FILE = "fake_license_violation_alert.log"

def random_alert_message():
    return random.choice(ALERT_TEMPLATES)

def show_notification(message):
    if notification:
        notification.notify(
            title="OSライセンス違反警告",
            message=message,
            timeout=8
        )
    else:
        print(f"[通知] OSライセンス違反警告: {message}")

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

def alert_once(verbose=False, log=False):
    msg = random_alert_message()
    show_notification(msg)
    if verbose:
        print(f"[通知] OSライセンス違反警告: {msg}")
    if log:
        log_alert(msg)

def alert_loop(interval_min=60, interval_max=300, count=5, verbose=False, log=False):
    for _ in range(count):
        alert_once(verbose=verbose, log=log)
        sleep_time = random.randint(interval_min, interval_max)
        if verbose:
            print(f"[INFO] 次の警告まで {sleep_time} 秒待機します。")
        time.sleep(sleep_time)

def list_log():
    try:
        with open(LOG_FILE, "r", encoding="utf-8") as f:
            lines = f.readlines()
            for line in lines:
                print(line.strip())
    except FileNotFoundError:
        print("[INFO] ログファイルが存在しません。警告履歴はありません。")

def summary_log():
    try:
        with open(LOG_FILE, "r", encoding="utf-8") as f:
            lines = f.readlines()
        print(f"[SUMMARY] 通知履歴: {len(lines)} 件")
        recent = lines[-5:] if len(lines) >= 5 else lines
        print("[最近の通知]")
        for line in recent:
            print(line.strip())
    except FileNotFoundError:
        print("[INFO] ログファイルが存在しません。")

def parse_args():
    parser = argparse.ArgumentParser(description="謎のOSライセンス違反警告をランダムに通知します。ジョーク用途のみ。")
    subparsers = parser.add_subparsers(dest="command")

    parser_once = subparsers.add_parser("once", help="1回だけ警告を表示")
    parser_once.add_argument("--verbose", action="store_true", help="詳細表示")
    parser_once.add_argument("--log", action="store_true", help="通知内容をログに保存")

    parser_loop = subparsers.add_parser("loop", help="複数回ランダム間隔で警告")
    parser_loop.add_argument("--min", type=int, default=60, help="最小間隔(秒)")
    parser_loop.add_argument("--max", type=int, default=300, help="最大間隔(秒)")
    parser_loop.add_argument("--count", type=int, default=5, help="通知回数")
    parser_loop.add_argument("--verbose", action="store_true", help="詳細表示")
    parser_loop.add_argument("--log", action="store_true", help="通知内容をログに保存")

    parser_list = subparsers.add_parser("list", help="通知ログを表示")
    parser_summary = subparsers.add_parser("summary", help="通知履歴のサマリ")

    return parser.parse_args()

def main():
    args = parse_args()
    if args.command == "once":
        alert_once(verbose=args.verbose, log=args.log)
    elif args.command == "loop":
        alert_loop(
            interval_min=args.min,
            interval_max=args.max,
            count=args.count,
            verbose=args.verbose,
            log=args.log
        )
    elif args.command == "list":
        list_log()
    elif args.command == "summary":
        summary_log()
    else:
        print("コマンドを指定してください (once/loop/list/summary)")
        sys.exit(1)

if __name__ == "__main__":
    main()

references/design_notes.md

# 概要
本Skillは、作業現場の緊張を和らげるための“ジョーク通知”を目的としています。現実には存在しないOSライセンス違反警告を、実際のデスクトップ通知として表示します。

# 公式ドキュメント抜粋
通知表示にはPythonのplyerライブラリを利用。plyerはクロスプラットフォームでデスクトップ通知APIを抽象化しており、Windows/macOS/Linuxで動作します。

# 利用例
- ペアプロや会議中に突然警告を出して話題作り
- 長時間作業中のリフレッシュやネタ演出
- SlackやTeamsの画面共有時に“謎警告”で盛り上げ

# 注意点
本Skillはジョーク専用であり、実際のシステムやセキュリティには影響しません。通知内容は毎回ランダム生成され、誤解を招かぬよう業務環境での利用には注意が必要です。

# 設計方針
- 実在API(plyer)のみ使用し、CLIサブコマンドで柔軟な実行が可能
- ログ保存機能により履歴管理も対応
- 通知内容はテンプレートからランダム選択し、毎回ユニークな体験を提供

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

ls .agent/skills/random-os-fake-license-violation-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で謎のOSライセンス違反警告をランダムに出してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。

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

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

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

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