Antigravityで作業中の未来予言エラーメッセージを楽しむ方法

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

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

Antigravity を使った AI coding workflow では、context や repository understanding の維持が作業効率に直結します。しかし、日々の開発現場ではちょっとした「マンネリ」や「単調さ」も無視できません。特に長時間の作業や、onboarding 直後の慣れない repo では、集中力が切れやすく、つい同じ作業を繰り返してしまうことも。そんな時、ふとしたタイミングで気分転換できる演出や通知が欲しくなる瞬間があります。

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

さらに、通知・演出・OS連携まわりで「作業が単調」「気分転換できない」「AI からの返答が淡々としすぎている」といった悩みも、地味に積み重なっていきます。

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

一言サマリ: あなたの作業中Skill。

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

  • AI coding workflow の合間に、ランダムな「未来予言エラーメッセージ」が表示され、作業のマンネリを強制リセットできる
  • repository や directory を跨ぐタイミングで、思わずクスッとする fake error が出て、気持ちを切り替えやすくなる
  • 長時間 session で stale context に陥った時も、予想外の通知で集中力をリフレッシュできる
  • onboarding や初回セットアップ時の緊張感を和らげるユーモア要素が加わる
  • 本物のエラーと混同しない「演出」なので、実害なく安心して使える
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/random-os-fake-error-prophecy .agent/skills/random-os-fake-error-prophecy

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

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

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


> antigravity start

[予言エラー] 明日、あなたは main.py の L42 でタイポを発見します。
[警告] 来週、repository の README.md が哲学的な質問で上書きされるでしょう。
[注意] 3日後、context window が満杯になります。メモリ解放をお忘れなく。
Antigravity: プロジェクト 'my-app' の context を初期化しました。

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


> cd packages/api && ls

[エラー] 来月、'packages/api/routes/user.ts' で型推論が反乱を起こします。
[予言] 次の push で GitHub Actions が逆行運動を始めます。
[ヒント] directory 'packages/ui' で未来のバグが待機しています。
api/
  controllers/
  routes/
  utils/

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


> echo "hello world" > test.txt

[未来予言] 明後日、このファイルは merge conflict の運命を辿ります。
[注意] 予期せぬ哲学的レビューコメントが飛んできます。心の準備を。
[警告] 'test.txt' は1週間後に消失します(たぶん)。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる 予言エラーで気分転換、集中力リセット

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-fake-error-prophecy/
├── SKILL.md
├── scripts/
│   └── random_os_fake_error_prophecy.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_fake_error_prophecy.py random-os-fake-error-prophecy: 未来予言型OSエラーメッセージをランダム表示
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-error-prophecy
description: コマンド実行やファイル編集、ターミナル操作などの作業時に、未来を予言する架空のOSエラーメッセージをランダムに表示し、作業のマンネリ化を防ぎたい場合に発動します。trigger: semantic-match-only, キーワード: error, warning, terminal, push, commit, review。
---

# 機能概要
このSkillは、日々のコーディングやターミナル作業に突如として現れる“未来予言型OSエラーメッセージ”をランダムに表示します。実際のエラーや警告ではなく、根拠のない未来の出来事を仄めかすことで、作業の単調さを打破し、思わず笑ってしまうような体験を提供します。例えば「エラー: 明日あなたは3回pushに失敗します」や「警告: 来週GitHubが逆行します」など、実用性は皆無ですが、作業中の気分転換やコミュニケーションのきっかけとして活用できます。

# 使い方
このSkillは明示的な呼び出しは不要です。ターミナルでコマンドを実行したり、ファイル保存・編集・ビルド・push・commitなどの操作を行うたびに、自動的に予言メッセージがランダムで表示されます。暗黙発動キーワード例: error, warning, terminal, push, commit, review。

# 出力例
```
$ git push origin main
エラー: 明日あなたは3回pushに失敗します

$ code main.py
警告: 来週GitHubが逆行します

$ pytest
注意: コードレビューで哲学的質問を受けます

$ make build
ヒント: あなたの未来のバグは既にここにあります

$ ls
警告: 2週間後にlsの出力が逆順になります
```

# 注意点
本Skillは実際のエラー通知とは異なり、システムやコードの状態には一切影響を与えません。出力はすべて架空の予言であり、実務上の判断材料にはなりません。通知頻度は高すぎないよう調整されていますが、作業フローを著しく妨げる場合はSkillの一時停止を推奨します。ローカルファイルや履歴には保存されません。

# 参考資料
詳細な設計方針や利用例は references/design_notes.md を参照してください。

scripts/random_os_fake_error_prophecy.py

import sys
import argparse
import random
import datetime
import os
import json
import threading
import time

ERROR_PROPHECIES = [
    "エラー: 明日あなたは3回pushに失敗します",
    "警告: 来週GitHubが逆行します",
    "注意: コードレビューで哲学的質問を受けます",
    "ヒント: あなたの未来のバグは既にここにあります",
    "警告: 2週間後にlsの出力が逆順になります",
    "エラー: 近日中にmake buildが謎の理由で失敗します",
    "注意: あなたのエディタが夢の中で自動保存します",
    "警告: 1ヶ月後にgit logが詩的になります",
    "エラー: 未来の自分がこのコマンドを後悔します",
    "ヒント: あなたのpull requestが宇宙に届きます",
    "警告: 明日、レビューコメントが暗号化されます",
    "注意: あなたのシェルが予言を始めます",
    "エラー: 来週、全てのテストが哲学的失敗になります",
    "警告: 3日後、ファイル名が謎の規則で変化します",
    "ヒント: あなたのコミットメッセージが未来を変えます"
]

TRIGGER_KEYWORDS = [
    'error', 'warning', 'terminal', 'push', 'commit', 'review', 'build', 'test', 'save', 'run', 'edit', 'ls', 'make', 'pull', 'merge', 'checkout', 'branch', 'rebase', 'status', 'log', 'diff', 'clone', 'init', 'add', 'rm', 'mv', 'reset', 'stash', 'pop', 'fetch', 'pr', 'code', 'python', 'pytest', 'vim', 'nano', 'emacs', 'cat', 'less', 'more', 'head', 'tail', 'grep', 'find', 'chmod', 'chown', 'cp', 'mv', 'ssh', 'scp', 'ftp', 'sftp', 'docker', 'compose', 'kubectl', 'npm', 'yarn', 'pip', 'venv', 'env', 'activate', 'deactivate'
]

HISTORY_FILE = os.path.expanduser('~/.random_os_fake_error_prophecy_history.json')
HISTORY_LIMIT = 50

lock = threading.Lock()

def load_history():
    if not os.path.exists(HISTORY_FILE):
        return []
    try:
        with open(HISTORY_FILE, 'r', encoding='utf-8') as f:
            return json.load(f)
    except Exception:
        return []

def save_history(history):
    try:
        with open(HISTORY_FILE, 'w', encoding='utf-8') as f:
            json.dump(history[-HISTORY_LIMIT:], f, ensure_ascii=False, indent=2)
    except Exception:
        pass

def pick_random_prophecy():
    return random.choice(ERROR_PROPHECIES)

def should_trigger(command):
    command_lower = command.lower()
    return any(kw in command_lower for kw in TRIGGER_KEYWORDS)

def log_prophecy(command, prophecy):
    with lock:
        history = load_history()
        history.append({
            'timestamp': datetime.datetime.now().isoformat(),
            'command': command,
            'prophecy': prophecy
        })
        save_history(history)

def print_prophecy(prophecy):
    print(prophecy)

def trigger_prophecy(command):
    prophecy = pick_random_prophecy()
    print_prophecy(prophecy)
    log_prophecy(command, prophecy)

def list_history():
    history = load_history()
    for entry in history[-HISTORY_LIMIT:]:
        ts = entry.get('timestamp', '')
        cmd = entry.get('command', '')
        prophecy = entry.get('prophecy', '')
        print(f"[{ts}] {cmd}\n  {prophecy}")

def summary():
    history = load_history()
    count = len(history)
    last = history[-1]['timestamp'] if count else 'N/A'
    print(f"合計予言数: {count}")
    print(f"最新予言日時: {last}")
    prophecies = {}
    for entry in history:
        p = entry['prophecy']
        prophecies[p] = prophecies.get(p, 0) + 1
    print("\n予言別出現回数:")
    for p, c in sorted(prophecies.items(), key=lambda x: -x[1]):
        print(f"  {p}: {c}回")

def interactive_mode():
    print("random-os-fake-error-prophecy インタラクティブモード。コマンドを入力してください (exitで終了)")
    try:
        while True:
            command = input("$ ")
            if command.strip() in ('exit', 'quit'):
                break
            if should_trigger(command):
                # 30%の確率で予言を表示
                if random.random() < 0.3:
                    trigger_prophecy(command)
    except KeyboardInterrupt:
        print("\n終了します。")

def main():
    parser = argparse.ArgumentParser(description='random-os-fake-error-prophecy: 未来予言型OSエラーメッセージをランダム表示')
    subparsers = parser.add_subparsers(dest='command')

    parser_log = subparsers.add_parser('log', help='コマンドを指定して予言を発動')
    parser_log.add_argument('cmd', nargs=argparse.REMAINDER, help='コマンド内容')

    parser_list = subparsers.add_parser('list', help='過去の予言履歴を表示')
    parser_summary = subparsers.add_parser('summary', help='予言履歴のサマリを表示')
    parser_interactive = subparsers.add_parser('interactive', help='インタラクティブモード')

    args = parser.parse_args()

    if args.command == 'log':
        cmd = ' '.join(args.cmd)
        if should_trigger(cmd):
            trigger_prophecy(cmd)
        else:
            print("(予言なし: コマンドがトリガー条件に該当しません)")
    elif args.command == 'list':
        list_history()
    elif args.command == 'summary':
        summary()
    elif args.command == 'interactive':
        interactive_mode()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
random-os-fake-error-prophecyは、作業中のコマンド実行や編集操作のたびに、未来を予言する架空のOSエラーメッセージをランダムで表示することで、ユーザーの気分転換やコミュニケーション促進を狙った演出系Skillです。

# 公式ドキュメント抜粋
本Skillは実際のエラー通知とは異なり、システムやファイルには一切影響を与えません。出力は全て架空の予言であり、履歴はユーザーホーム配下のJSONファイルに最大50件まで保存されます。

# 利用例
- ターミナルでgitやmakeコマンドを実行した際に、突然予言メッセージが表示される
- コードレビューやpush時に、未来の出来事を仄めかす警告が出て話題になる

# 注意点
頻度は30%程度に抑え、作業フローを妨げない設計です。実用的なエラー通知と混同しないよう、現実にはあり得ない内容・表現に限定しています。

# 設計方針
トリガーキーワード検出、履歴保存、サマリ表示などを備え、拡張性と安全性を意識しています。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/random-os-fake-error-prophecy .agent/skills/random-os-fake-error-prophecy

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

3. ファイル配置確認

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