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エージェントとのやり取りにユーモアが加わり、「またエラーか…」というストレスが軽減される
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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
