Antigravityで作業中に古典詩通知を自動化する方法入門

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

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

Antigravity の AI coding workflow を日々使っていると、思わぬタイミングで集中が途切れたり、作業が単調になったりすることが少なくありません。とくに monorepo や大規模 repository を扱う現場では、context や path management の煩雑さに加えて、セッションの合間にちょっとした「間」や「気分転換」が欲しくなる瞬間も多いものです。

また、通知や演出まわりの Skill を活用したいと思っても、実用的なものばかりで遊び心のあるものが少なく、開発現場に“ちょっとした笑い”や“知的な混乱”をもたらす演出を求める声も増えています。そんな中、Antigravity の context や repository understanding に関する悩みと、通知系 Skill のマンネリ感が重なり、次のような困りごとが生まれがちです。

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

このような技術的な悩みの合間に、何か突拍子もない通知や演出があれば、気分転換やチーム内の話題づくりにもつながるはずです。

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

一言サマリ: このスキルは、作業中に完全ランダムな“古文調・謎ポエム”を通知として炸裂させ、Antigravity の単調な開発 workflow に知的な混乱と笑いをもたらします。

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

  • AI coding workflow の合間に、予測不能な詩的通知が現れ、集中力のリセットや気分転換が自然に生まれる
  • monorepo や複雑な repository 作業のストレスが、思わぬ“古代文学の風”によって和らぐ
  • Antigravity の context 管理や path management の合間に、チーム内のコミュニケーションや話題づくりのきっかけが増える
  • 「また説明か…」というマンネリ感を、毎回異なる謎ポエムが打ち破るため、長時間 session でも飽きにくい
  • 通知・演出系 Skill の枠を超え、repository understanding の“隙間”に遊び心を差し込める
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/random-os-fake-ancient-poem-notifier .agent/skills/random-os-fake-ancient-poem-notifier

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

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

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


> プロジェクト初期化して、mainブランチの全体像を把握したい

[OS通知] 
『西のコードベースにバグの風そよぐ
  古きディレクトリ、静かに眠る』
(…Antigravity context: repository structure loaded...)

[Antigravity]
mainディレクトリ: /src, /tests, /docs
context: main branch, package.json, README.md

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


> packages/core から packages/utils に移動して関数を修正

[OS通知] 
『パッケージの谷間に迷いし者よ
  utilsの彼方、未知の関数ぞ現る』

[Antigravity]
monorepo detected: packages/core, packages/utils, packages/api
context updated: now focusing on packages/utils

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


> ちょっと休憩したい、何か面白いことない?

[OS通知] 
『あなたのShiftキー、今宵は静かに眠るべし
  バックスペースの調べ、闇夜に響く』

(おまけ: 何も関係ない詩が突然表示される)

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開+謎ポエム通知で気分転換
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る+詩的通知で“移動”を演出
長時間 workflow long context で重要箇所が薄まる 適度なタイミングで詩的通知が入り、集中力をリセット

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-fake-ancient-poem-notifier/
├── SKILL.md
├── scripts/
│   └── random_os_fake_ancient_poem_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-ancient-poem-notifier
description: Antigravityがユーザーの作業中や一定時間経過時、もしくは“通知”“詩”“古文”“息抜き”などのキーワードを検知した際に発動し、完全ランダムな古文調の詩的通知を表示します。通知内容は作業やエラー内容と無関係です。
---

# 機能概要
このSkillは、現代の開発現場に突如として“古代文学の風”を吹き込むユニークな通知スキルです。ユーザーの作業中や特定のキーワード(例:通知、詩、古文、息抜き)を検知した際に、完全ランダムな古文調・詩体の謎ポエムをデスクトップやターミナルに通知します。内容は作業内容やエラーとは一切無関係で、集中力を絶妙にそらしつつ、知的混乱と笑いを提供します。日常のコーディングに新たな刺激と遊び心をもたらします。

# 使い方
このSkillは明示的な呼び出しは不要です。Antigravityが「通知」「詩」「古文」「息抜き」などの発話や、作業中の一定時間経過を検知した際に自動で発動します。暗黙発動キーワード例:
- 「ちょっと息抜きしたい」
- 「通知を表示して」
- 「詩的な一言を」

# 出力例
```
[OS古代詩通知]
西のコードベースにバグの風そよぐ
あなたのShiftキー、今宵は静かに眠るべし
朝霧のメモリ、解放されぬまま
デバッグの道、遠く霞みて

[OS古代詩通知]
コンパイルの鐘、虚空に響く
エラーの渦巻、心を惑わす

[OS古代詩通知]
ファイルの彼方、未保存の夢
```

# 注意点
- 通知内容は完全にランダムであり、実際のシステム状態や作業内容とは一切関係ありません。
- 本Skillは既存のシステム通知や作業ファイルを変更・破壊しません。
- ローカルに通知履歴は保存されません。
- デスクトップ通知はOS標準API(notify-send, osascript, win10toast等)を利用します。

# 参考資料
- [Python公式: 通知API](https://docs.python.org/ja/3/library/subprocess.html)
- references/design_notes.md も参照

scripts/random_os_fake_ancient_poem_notifier.py

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

POEMS = [
    [
        "西のコードベースにバグの風そよぐ",
        "あなたのShiftキー、今宵は静かに眠るべし",
        "朝霧のメモリ、解放されぬまま",
        "デバッグの道、遠く霞みて"
    ],
    [
        "コンパイルの鐘、虚空に響く",
        "エラーの渦巻、心を惑わす"
    ],
    [
        "ファイルの彼方、未保存の夢"
    ],
    [
        "if文の彼岸、elseの彼方",
        "print文、夜明けに消えゆく"
    ],
    [
        "メモリの谷間に、GCの風渡る",
        "変数の名も、今は昔"
    ],
    [
        "ビルドの雲間に、光る警告",
        "警告の雨、止むことなし"
    ],
    [
        "関数の森に、迷い人ひとり",
        "returnの道、いまだ見えず"
    ],
    [
        "ログの海原、波高く",
        "スタックトレース、岸に打ち寄せる"
    ],
    [
        "mainの門、静かに開かれ",
        "無限ループ、時を刻む"
    ],
    [
        "バージョンの月、満ち欠けし",
        "古きAPI、夢のごとし"
    ]
]

NOTIFY_TITLE = "OS古代詩通知"


def select_random_poem():
    poem = random.choice(POEMS)
    return "\n".join(poem)


def notify_desktop(message):
    system = platform.system()
    try:
        if system == "Linux":
            # Use notify-send
            subprocess.run(["notify-send", NOTIFY_TITLE, message])
        elif system == "Darwin":
            # Use osascript for macOS
            script = f'display notification "{message}" with title "{NOTIFY_TITLE}"'
            subprocess.run(["osascript", "-e", script])
        elif system == "Windows":
            try:
                from win10toast import ToastNotifier
                toaster = ToastNotifier()
                toaster.show_toast(NOTIFY_TITLE, message, duration=5)
            except ImportError:
                print("win10toastが見つかりません。pip install win10toast でインストールしてください。", file=sys.stderr)
        else:
            print(f"[通知未対応OS] {NOTIFY_TITLE}:\n{message}")
    except Exception as e:
        print(f"[通知エラー] {e}\n{NOTIFY_TITLE}:\n{message}")


def print_terminal(message):
    print(f"[{NOTIFY_TITLE}]\n{message}\n")


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


def list_log():
    log_path = os.path.expanduser("~/.random_os_fake_ancient_poem_notifier.log")
    if not os.path.exists(log_path):
        print("通知履歴はありません。")
        return
    with open(log_path, encoding="utf-8") as f:
        print(f.read())


def summary_log():
    log_path = os.path.expanduser("~/.random_os_fake_ancient_poem_notifier.log")
    if not os.path.exists(log_path):
        print("通知履歴はありません。")
        return
    count = 0
    with open(log_path, encoding="utf-8") as f:
        for line in f:
            if line.startswith("[") and "]" in line:
                count += 1
    print(f"これまでに{count}件の古代詩通知が発動しました。")


def main():
    parser = argparse.ArgumentParser(description="OS古代詩通知スキル")
    subparsers = parser.add_subparsers(dest="command", required=False)

    parser_log = subparsers.add_parser("log", help="通知履歴を表示")
    parser_summary = subparsers.add_parser("summary", help="通知履歴のサマリーを表示")
    parser_run = subparsers.add_parser("run", help="1回だけランダム通知を発動")
    parser_daemon = subparsers.add_parser("daemon", help="一定間隔で自動通知 (Ctrl+Cで停止)")
    parser_daemon.add_argument("--interval", type=int, default=1800, help="通知間隔(秒) デフォルト30分")

    args = parser.parse_args()

    if args.command == "log":
        list_log()
    elif args.command == "summary":
        summary_log()
    elif args.command == "run":
        poem = select_random_poem()
        notify_desktop(poem)
        print_terminal(poem)
        log_poem(poem)
    elif args.command == "daemon":
        print(f"{NOTIFY_TITLE} デーモンを開始します。Ctrl+Cで停止。通知間隔: {args.interval}秒")
        try:
            while True:
                poem = select_random_poem()
                notify_desktop(poem)
                print_terminal(poem)
                log_poem(poem)
                time.sleep(args.interval)
        except KeyboardInterrupt:
            print("\nデーモンを停止しました。")
    else:
        # デフォルト動作: 1回だけ通知
        poem = select_random_poem()
        notify_desktop(poem)
        print_terminal(poem)
        log_poem(poem)

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
本Skillは、開発現場に“知的混乱”とユーモアを届けるため、古文調の詩的通知を完全ランダムで発動するものです。通知内容は実際の作業やエラーと無関係で、集中力のリセットや気分転換を狙っています。

# 公式ドキュメント抜粋
- Pythonの標準subprocessモジュールを用い、Linuxではnotify-send、macOSではosascript、Windowsではwin10toast(API要インストール)を利用。
- 参考: https://docs.python.org/ja/3/library/subprocess.html

# 利用例
- 長時間のコーディング中、突如“OS古代詩通知”が現れ、チーム全体に笑いが起きる。
- ターミナルで `python random_os_fake_ancient_poem_notifier.py daemon --interval 600` のように定期発動。

# 注意点
- 通知は完全に無害で、既存のファイルやシステム設定を変更しません。
- win10toastが未インストールの場合はpipで追加が必要です。
- 履歴はホームディレクトリ直下の隠しログファイルに保存されます。

# 設計方針
- OSごとの通知APIを直接呼び出すことで、追加ライブラリなしでも動作。
- 詩の内容は今後拡張可能なリスト構造。
- ログ機能を持たせ、過去の通知も振り返り可能。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/random-os-fake-ancient-poem-notifier .agent/skills/random-os-fake-ancient-poem-notifier

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

3. ファイル配置確認

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