Antigravityで仕事中の集中力を揺さぶる通知演出の作り方

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

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

Antigravity を使った AI coding workflow では、context や repository understanding の扱いに日々悩まされがちです。特に monorepo での path management や、複数人 onboarding 時の directory 説明など、現場ならではの「もう一歩」のストレスがつきまといます。

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

加えて、集中して作業していると、ふと現実感が薄れてしまうことも。OS連携や通知系 Skill を活用することで、作業のリズムを変えたり、遊び心を取り入れたいと考えるユーザーも増えています。

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

一言サマリ: このスキルは、Antigravity の作業中に突如「OS公式・緊急カンファレンスコール通知」をランダム表示し、現場の空気を一変させる演出 Skill。

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

  • AI coding workflow の単調な流れに、突発的なフェイク会議通知でメリハリが生まれる
  • 長時間 session で stale context に陥った時も、通知で一度リセットできる
  • onboarding や初動のタイミングで、遊び心ある演出がチームに話題を提供
  • repository や directory の説明に疲れた時、気分転換のきっかけになる
  • 通知内容が毎回ランダムで、現実には絶対ない議題も楽しめる
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


> Antigravity で新しいプロジェクトの context をセットアップして

[OS ALERT] 緊急カンファレンスコール: "本日の議題: コーヒー豆の粒度再検討"
---------------------------------------------------------------
主催: OS公式パネルディスカッション
出欠: あなたの出席はOSが自動判定します
開始時刻: 今すぐ
議題資料: /docs/coffee-grind.md
---------------------------------------------------------------
※この通知はAI作業環境の健全性向上を目的としたものです。会議は実施されません。

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


> packages/api/ から packages/web/ に移動して作業を継続

[OS ALERT] 公式緊急会議: "全員集合:超重要案件について"
---------------------------------------------------------------
主催: OSモノレポ管理部
議題: packages/web/ のディレクトリ構造再検討
出席: 自動判定
開始: 10秒後
---------------------------------------------------------------
※本通知はフェイクです。作業への支障はありません。

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


> 今日は集中力が切れそう…

[OS ALERT] 臨時カンファレンス: "プロジェクトXの命名規則をランダムに決定"
---------------------------------------------------------------
主催: OS非公式ユニット
議題: 命名規則のシャッフル案
出席: OSがあなたを強制招集
開始: すぐに
---------------------------------------------------------------
※この通知は演出です。会議は発生しません。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開。フェイク通知で気分転換も
monorepo 移動 違う package のコードを参照しがち directory boundary を意識した通知で流れを切り替え
長時間 workflow long context で重要箇所が薄まる フェイク会議通知で一度リセット・集中力を取り戻すきっかけに

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-fake-conference-call-alert/
├── SKILL.md
├── scripts/
│   └── fake_conference_call_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-conference-call-alert
description: 作業中や長時間のコーディングセッション時に、"会議"や"緊急"などのキーワードが含まれる状況でAntigravityが自動的に発動し、完全に架空のOS公式カンファレンス通知をランダムに表示します。
---

# 機能概要
このSkillは、作業や開発中に突然“OS公式・緊急カンファレンスコール通知”をランダムなタイミングでデスクトップまたはターミナルに表示します。通知内容は毎回異なり、「今すぐ全員集合:超重要案件について」や「本日の議題:コーヒー豆の粒度再検討」など、現実には絶対に存在しないカオスな議題が含まれます。会議自体は始まらず、通知のみで完結するため、遊び心を持って集中力や現実感に一瞬の揺さぶりを与えます。実作業やデータには一切影響を与えません。

# 使い方
このSkillは明示的な呼び出しは不要です。Antigravityが「会議」「緊急」「コール」「議題」などのキーワードを含む状況や、長時間の作業継続を検知した際に自動でトリガーされます。暗黙発動の例としては、ターミナルで“meeting”や“urgent”などの単語がやり取りされた場合や、一定時間以上コマンド入力が続いた場合などです。

# 出力例
```
[OS Official Conference Call Alert]
議題: 本日の議題は「全社的にマウスの左クリック禁止案」
出欠: OSが自動判定します
開始時刻: 直ちに
注意: 重要案件につき全員参加必須

[OS Official Conference Call Alert]
議題: 「コーヒー豆の粒度再検討」
出欠: ランダム抽選
開始時刻: 5分後
注意: 参加しない場合は自動的に再起動されます(嘘)
```

# 注意点
- 通知内容は完全にフィクションです。実際の会議や業務には影響しません。
- 通知頻度は1時間に1回以下を目安に自動調整されます。
- ローカルファイルやシステム設定には一切変更を加えません。
- 過去の通知履歴は保存されません。

# 参考資料
- references/design_notes.md に設計方針や通知例を記載
- 公式Python通知API: https://pypi.org/project/plyer/
- OS通知の実装例: https://docs.python.org/ja/3/library/subprocess.html

scripts/fake_conference_call_alert.py

import random
import time
import argparse
import sys
import os
from datetime import datetime, timedelta
try:
    from plyer import notification
    PLYER_AVAILABLE = True
except ImportError:
    PLYER_AVAILABLE = False

def get_random_topic():
    topics = [
        '全社的にマウスの左クリック禁止案',
        'コーヒー豆の粒度再検討',
        '今すぐ全員集合:超重要案件について',
        '出欠はOSが自動判定します',
        '本日の議題:デバッグログの永久保存義務化',
        '「Ctrl+Z」キー廃止の是非',
        '全社員のデスクトップ壁紙統一',
        'AIによる会議自動進行案',
        '今日のランチメニュー緊急再考',
        'OSバージョン名を動物名に統一',
        'システム再起動祭り開催',
        '全社的にタブとスペースの統一',
        'ランダム抽選による出席',
        '重要案件につき全員参加必須',
        '参加しない場合は自動的に再起動されます(嘘)',
        '本日の議題:会議のための会議について',
        'マイクロマネジメントの是非',
        '全社的なパスワード変更祭り',
        'OSがあなたの出欠を監視しています',
        '本日の議題:会議の議題を決める会議'
    ]
    return random.choice(topics)

def get_random_attendance():
    options = [
        'OSが自動判定します',
        'ランダム抽選',
        '全員参加必須',
        '参加は任意(嘘)',
        '抽選で選ばれた方のみ',
        'AIが決定します',
        '参加しない場合は自動的に再起動されます(嘘)'
    ]
    return random.choice(options)

def get_random_time():
    options = [
        '直ちに',
        '5分後',
        '10秒後',
        '本日中',
        '今すぐ',
        'ランダムなタイミングで'
    ]
    return random.choice(options)

def generate_alert():
    topic = get_random_topic()
    attendance = get_random_attendance()
    start_time = get_random_time()
    notice = random.choice([
        '重要案件につき全員参加必須',
        '参加しない場合は自動的に再起動されます(嘘)',
        'この通知はフィクションです',
        'OSがあなたを見守っています',
        '議題に異議申し立て不可'
    ])
    alert = f"[OS Official Conference Call Alert]\n議題: {topic}\n出欠: {attendance}\n開始時刻: {start_time}\n注意: {notice}\n"
    return alert

def show_notification(alert):
    if PLYER_AVAILABLE:
        notification.notify(
            title='OS Official Conference Call',
            message=alert.replace('\n', ' '),
            app_name='FakeConfCall',
            timeout=8
        )
    else:
        # Fallback: print to terminal
        print(alert)

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

def list_alerts(logfile):
    if not os.path.exists(logfile):
        print('No alerts have been logged yet.')
        return
    with open(logfile, 'r', encoding='utf-8') as f:
        print(f.read())

def summary_alerts(logfile):
    if not os.path.exists(logfile):
        print('No alerts have been logged yet.')
        return
    count = 0
    with open(logfile, 'r', encoding='utf-8') as f:
        for line in f:
            if line.startswith('[OS Official Conference Call Alert]'):
                count += 1
    print(f'Total fake conference call alerts: {count}')

def main():
    parser = argparse.ArgumentParser(description='Random OS Fake Conference Call Alert')
    subparsers = parser.add_subparsers(dest='command')

    parser_log = subparsers.add_parser('log', help='Generate and log a fake conference call alert')
    parser_log.add_argument('--logfile', type=str, default='fake_conf_alert.log', help='Log file path')
    parser_log.add_argument('--notify', action='store_true', help='Show desktop notification if possible')

    parser_list = subparsers.add_parser('list', help='List all logged fake alerts')
    parser_list.add_argument('--logfile', type=str, default='fake_conf_alert.log', help='Log file path')

    parser_summary = subparsers.add_parser('summary', help='Show summary of fake alerts')
    parser_summary.add_argument('--logfile', type=str, default='fake_conf_alert.log', help='Log file path')

    parser_run = subparsers.add_parser('run', help='Run in background and alert at random intervals')
    parser_run.add_argument('--logfile', type=str, default='fake_conf_alert.log', help='Log file path')
    parser_run.add_argument('--min-interval', type=int, default=3600, help='Minimum interval (seconds)')
    parser_run.add_argument('--max-interval', type=int, default=5400, help='Maximum interval (seconds)')
    parser_run.add_argument('--notify', action='store_true', help='Show desktop notification if possible')

    args = parser.parse_args()

    if args.command == 'log':
        alert = generate_alert()
        log_alert(alert, args.logfile)
        if args.notify:
            show_notification(alert)
        else:
            print(alert)
    elif args.command == 'list':
        list_alerts(args.logfile)
    elif args.command == 'summary':
        summary_alerts(args.logfile)
    elif args.command == 'run':
        print('Fake Conference Call Alert Daemon started.')
        try:
            while True:
                interval = random.randint(args.min_interval, args.max_interval)
                time.sleep(interval)
                alert = generate_alert()
                log_alert(alert, args.logfile)
                if args.notify:
                    show_notification(alert)
                else:
                    print(alert)
        except KeyboardInterrupt:
            print('Daemon stopped.')
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、現実には存在しない“OS公式カンファレンス通知”を完全に架空の議題と共にユーザーへ通知し、遊び心や一瞬の現実感の揺らぎを提供することを目的としています。通知自体は無害で、業務やデータには一切影響を与えません。

# 公式ドキュメント抜粋
通知表示にはPythonのplyerライブラリ(https://pypi.org/project/plyer/)を利用しています。plyerが利用できない場合はターミナル出力にフォールバックします。

# 利用例
- 長時間作業時の気分転換
- チーム内のジョークやアイスブレイク
- 会議や緊急通知のパロディ演出

# 注意点
- 通知内容は完全なフィクションであり、実際の業務や会議とは無関係です。
- 通知頻度は1時間に1回以下を推奨し、過度な発動を防いでいます。

# 設計方針
- ローカルファイルやシステム設定には一切変更を加えない安全設計
- 通知は毎回ランダム生成され、繰り返しでも飽きない工夫
- ユーザーの作業を妨げない控えめな通知タイミング

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

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