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 を感じたとき、意図的にリフレッシュを促す演出になる
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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
