Antigravityでエラーメッセージを詩に変換する驚きの活用ガイド

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

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

Antigravity を日々利用していると、真面目なコーディングやリポジトリ管理の最中に、思わず笑ってしまうような“肩の力を抜きたい瞬間”がしばしば訪れます。しかし、現状の AI coding workflow では、エラー発生時の体験はどこまでも無機質。context や repository understanding の高度化が進んでも、作業の合間にちょっとした癒しや遊び心が欲しくなるものです。

  • ターミナルやエディタでエラーが出るたび、無機質なメッセージに気持ちが沈む
  • Antigravity の path management で directory 指定ミスをした際、冷たいエラーログが返るだけ
  • monorepo で packages を跨ぐと、repo の構造や context を間違えやすく、エラーが頻発する
  • 長時間の AI coding workflow で long context が膨らみ、エラーの原因特定が単調な作業になりがち
  • session 再開時や onboarding で、失敗したコマンドのエラーが単なる障害物としてしか見えない

こうした「真面目なエラー体験」に、ちょっとした遊び心を加えてくれる Skill があれば、日々の開発がぐっと楽しくなるはずです。

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

一言サマリ: ターミナルやエディタでコマンド実行時にエラーが発生したらSkill。

このSkillを導入することで、以下のようなメリットが得られます。

  • エラーメッセージが重厚な詩として返るため、作業中の気分転換やモチベーション維持に役立つ (Antigravity の AI coding workflow が一気に遊び心あるものに変化)
  • context や repository understanding の失敗時も、詩的な表現で directory や path の問題点を直感的に把握できる
  • monorepo や大規模 repository でのエラーも、単なる障害ではなく「物語の一幕」として楽しめる
  • onboarding や session 再開時に出るエラーも、堅苦しさが和らぎ、チーム内でのコミュニケーション活性化にもつながる
  • AIエージェントとのやり取りにユーモアが加わり、「またエラーか…」というストレスが軽減される
QUICK INSTALL
このSkillをすぐ試す

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

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

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

実際にSkillが発動すると、普段のエラー出力が即興の詩に変換されます。以下はその一例です。

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


> git clone git@github.com:sample/awesome-monorepo.git
Cloning into 'awesome-monorepo'...
fatal: Could not read from remote repository.

【詩】
遥かなるリポジトリの彼方より
許されぬ権限よ、我が手にパーミッションを
見えぬ道筋は、アクセスの夢に消え
君の鍵は未だ扉を開かず
心の SSH、今こそ正しき鍵を求めん

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


> cd packages/api && npm run build
Error: Cannot find module 'src/server.ts'

【詩】
見つからぬ道、404の黄昏
パッケージの森に迷いし我
src/server.tsは幻となりて
directoryの闇に吸い込まれる
再び path を照らす光を、今

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


> rm -rf /

rm: cannot remove '/': Permission denied

【詩】
全てを消し去るその手前で
システムの守護者は静かに囁く
「許されぬ破壊は、運命の外」
パーミッションの壁は高く
世界を守る詩が、ここに在る

before / after の違い

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

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-error-poetry/
├── SKILL.md
├── scripts/
│   └── os_error_poetry.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-error-poetry
description: Antigravity でコマンド実行やファイル操作時に 'Permission denied' や 'File not found' などの典型的なOSエラーが発生した際、自動で詩的なメッセージに変換して表示するSkillです。エラー内容のキーワード検出時に発動します。
---

# 機能概要
random-os-error-poetry は、ターミナルやエディタで頻出するOSエラー(例: Permission denied, No such file or directory, File exists, Is a directory など)を検知すると、そのエラーメッセージを重厚かつユーモラスな詩に即興変換して表示します。作業中の苛立ちや疲労を和らげるため、厳しいエラーも思わず笑ってしまうポエムに変身。通常のエラー出力も参照可能なため、デバッグや作業効率を損なうことなく、気分転換やチームの雰囲気づくりに役立ちます。

# 使い方
このSkillは明示的な呼び出しは不要です。Antigravity上でコマンド実行時やファイル操作時に、エラーメッセージ(例: 'Permission denied', 'No such file or directory', 'Is a directory', 'File exists', 'Not a directory', 'Connection refused' など)を検出すると自動発動します。暗黙発動キーワード例: 'permission', 'not found', 'refused', 'directory', 'exists'。

# 出力例
```
$ cat secret.txt
cat: secret.txt: Permission denied
---
許されぬ権限よ、我が手にパーミッションを。
閉ざされた扉の向こうに、静かなるファイルは眠る。
(原文: Permission denied)

$ ls /notfound
ls: cannot access '/notfound': No such file or directory
---
見つからぬ道、404の黄昏。
ファイルの幻影は、虚空に消えゆく。
(原文: No such file or directory)
```

# 注意点
- 原文エラーも併記されるため、通常のデバッグ作業を妨げません。
- 変換は主要な英語エラーのみ対応。ローカル保存や履歴管理は行いません。
- システムクリティカルなエラーや非OS系例外は除外されます。

# 参考資料
- [Python 標準エラー一覧](https://docs.python.org/ja/3/library/exceptions.html)
- references/design_notes.md も参照してください。

scripts/os_error_poetry.py

import sys
import traceback
import argparse
import random
from typing import Optional, Tuple, List

# 詩的変換テンプレート集
POETRY_TEMPLATES = {
    'Permission denied': [
        '許されぬ権限よ、我が手にパーミッションを。\n閉ざされた扉の向こうに、静かなるファイルは眠る。',
        '扉は固く閉ざされ、我が願いは届かず。\n権限なき者に道は開かれぬ。'
    ],
    'No such file or directory': [
        '見つからぬ道、404の黄昏。\nファイルの幻影は、虚空に消えゆく。',
        '探し求めしものは、既にこの世になし。\nディレクトリの彼方に、静寂だけが残る。'
    ],
    'File exists': [
        '既に在りしもの、二度とは生まれず。\n存在の重みが、上書きを拒む。',
        '重複の悲しみ、ファイルは既に息づく。\n新しき名を与えよ。'
    ],
    'Is a directory': [
        'それは道なり、ファイルにあらず。\nディレクトリの深淵を覗くなかれ。',
        'ファイルと思いしは、実は道標。\nディレクトリの森を彷徨う。'
    ],
    'Not a directory': [
        '道と思いきや、そこは壁。\nディレクトリの名を持たぬ者よ。',
        '進むべき道は閉ざされ、そこにディレクトリは無い。'
    ],
    'Connection refused': [
        '繋がらぬ想い、拒まれし通信。\nサーバの沈黙に、心は波打つ。',
        '門は閉ざされ、接続は叶わず。\nネットワークの彼方に声は届かない。'
    ],
    'Not implemented': [
        '未だ見ぬ機能、実装の夜明けを待つ。\n未来への扉は、今は閉じられている。'
    ],
    'Timeout': [
        '時の流れに追いつけず。\nタイムアウトの鐘が静かに鳴る。'
    ]
}

# エラーメッセージから詩を生成
def poeticize_error(error_msg: str) -> Optional[str]:
    for key, poems in POETRY_TEMPLATES.items():
        if key.lower() in error_msg.lower():
            return random.choice(poems)
    return None

# エラーハンドリングラッパー
class PoetryErrorHandler:
    def __init__(self):
        self.last_error = None

    def handle(self, exc_type, exc_value, exc_tb):
        tb_str = ''.join(traceback.format_exception(exc_type, exc_value, exc_tb))
        error_msg = str(exc_value)
        poem = poeticize_error(error_msg)
        if poem:
            print('---')
            print(poem)
            print(f'(原文: {error_msg})')
        else:
            print('---')
            print('エラーが発生しましたが、詩的変換できませんでした。')
            print(f'(原文: {error_msg})')
        self.last_error = (exc_type, exc_value, tb_str)

# CLIサブコマンド: ファイルを開いて読み込む(エラー発生時に詩化)
def cmd_cat(args):
    try:
        with open(args.filename, 'r', encoding='utf-8') as f:
            print(f.read())
    except Exception as e:
        sys.excepthook(*sys.exc_info())

# CLIサブコマンド: ディレクトリをリストする
import os
def cmd_ls(args):
    try:
        files = os.listdir(args.path)
        for name in files:
            print(name)
    except Exception as e:
        sys.excepthook(*sys.exc_info())

# CLIサブコマンド: ファイルを新規作成(既存ならエラー)
def cmd_touch(args):
    try:
        with open(args.filename, 'x', encoding='utf-8') as f:
            f.write('')
        print(f'{args.filename} を作成しました')
    except Exception as e:
        sys.excepthook(*sys.exc_info())

# CLIサブコマンド: ダミーで接続失敗を再現
def cmd_connect(args):
    import socket
    try:
        s = socket.create_connection((args.host, args.port), timeout=2)
        s.close()
        print('接続成功')
    except Exception as e:
        sys.excepthook(*sys.exc_info())

# CLIサブコマンド: 任意のエラーメッセージを詩化
def cmd_poem(args):
    poem = poeticize_error(args.message)
    if poem:
        print('---')
        print(poem)
        print(f'(原文: {args.message})')
    else:
        print('---')
        print('詩的変換できませんでした。')
        print(f'(原文: {args.message})')

# メイン関数

def main():
    handler = PoetryErrorHandler()
    sys.excepthook = handler.handle
    parser = argparse.ArgumentParser(description='OSエラーを詩的に変換するCLIツール')
    subparsers = parser.add_subparsers(dest='command')

    parser_cat = subparsers.add_parser('cat', help='ファイル内容を表示')
    parser_cat.add_argument('filename')
    parser_cat.set_defaults(func=cmd_cat)

    parser_ls = subparsers.add_parser('ls', help='ディレクトリ一覧')
    parser_ls.add_argument('path')
    parser_ls.set_defaults(func=cmd_ls)

    parser_touch = subparsers.add_parser('touch', help='新規ファイル作成')
    parser_touch.add_argument('filename')
    parser_touch.set_defaults(func=cmd_touch)

    parser_connect = subparsers.add_parser('connect', help='ホストに接続')
    parser_connect.add_argument('host')
    parser_connect.add_argument('port', type=int)
    parser_connect.set_defaults(func=cmd_connect)

    parser_poem = subparsers.add_parser('poem', help='任意のエラーメッセージを詩化')
    parser_poem.add_argument('message')
    parser_poem.set_defaults(func=cmd_poem)

    args = parser.parse_args()
    if hasattr(args, 'func'):
        args.func(args)
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
random-os-error-poetryは、OSエラーを詩的に変換することで、開発現場にユーモアと癒しをもたらすことを目的としています。実際のエラーメッセージを損なわず、詩的表現を添えることで、作業効率を維持しつつ気分転換が可能です。

# 公式ドキュメント抜粋
- Python 標準例外: https://docs.python.org/ja/3/library/exceptions.html
- os, socket, argparse 標準APIを利用

# 利用例
- チーム開発時のペアプロやレビューで、エラー発生時に場の雰囲気を和らげる
- 長時間作業や深夜コーディングでの気分転換
- 教育現場でエラー内容の理解促進

# 注意点
- 主要な英語エラーのみ対応。日本語や特殊なエラーは詩化されません。
- クリティカルなシステムエラーやセキュリティ関連例外は詩化対象外です。
- ログや履歴は保存されません。

# 設計方針
- エラー発生時に原文も必ず併記し、通常のデバッグを妨げない
- poetryテンプレートは拡張可能な辞書型で管理
- CLIサブコマンドで実環境テストやカスタムメッセージ詩化も可能

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

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