Antigravity ユーザーが日常でぶつかる悩み
AI coding workflow を長く使っていると、集中力が切れたり、現実感が薄まる瞬間は意外と多いものです。特に Antigravity のような repository understanding や context 管理が強力なツールでは、作業が単調になりがちで、ふとしたタイミングで「何か刺激が欲しい」と感じることも。通知や演出系の Skill が少ない現状では、作業中のちょっとした遊び心や、強制的なリフレッシュが欲しくなることもあります。
- Antigravity が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Antigravity が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
また、通知・演出・OS連携カテゴリの Skill が少ない現状では、作業にアクセントが欲しいという声も多く、単調なリポジトリ管理や context 設定に飽きてしまう瞬間があります。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは、Antigravity の作業フローに「謎のOSアップデート進行中」演出を挿入し、現実感や集中力を絶妙にかき乱す演出Skill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- AI coding workflow の単調さを打破し、作業中に意図的な「ノイズ」を挟むことでリフレッシュ感を演出できる
- repo や directory の切り替わりタイミングで、謎の進捗バーが現れて現実感をリセットできる
- onboarding や長時間 session の間に、意味不明なアップデート演出で気分転換ができる
- Antigravity の context 管理に遊び心を加え、記憶や path management の作業を軽く感じられる
- 「何もしていないのにアップデート中」演出で、repo 作業の緊張感を和らげる
GitHub から degit でコマンド1行、Antigravity の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/antigravity/os-fake-mystery-update-progress .agent/skills/os-fake-mystery-update-progress実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。
シーン1: session 開始時 (プロジェクト初動で)
> Antigravity, このリポジトリの全体像を教えて
[OS Update] 未知の言語パーサ更新中... [===== ] 56%
[OS Update] 禁断のメタAIモジュール最適化中... [==== ] 42%
[OS Update] 伝説のバグを発掘中... [======= ] 74%
[OS Update] 進捗バーが一時停止しました。再開までお待ちください...
(数秒後)
[OS Update] 進捗バーが逆流しています... [=== ] 30%
[OS Update] アップデート完了(本当に何も変わっていません)
シーン2: monorepo / package 跨ぎ作業時
> packages/auth/ のディレクトリ構造を整理して
[OS Update] 秘密のAPIを最適化中... [==== ] 40%
[OS Update] monorepo 境界を超えた謎のプロセス発生中... [===== ] 55%
[OS Update] 謎のパッケージ依存性を解析中... [==== ] 48%
[OS Update] 進捗バーが止まりました。しばらくお待ちください...
(しばらくして)
[OS Update] 進捗バーが逆流しています... [== ] 20%
[OS Update] アップデート完了(何も起きていません)
シーン3: お遊び的な使い方
> ちょっと休憩したい
[OS Update] 伝説のバグを発掘中... [====== ] 65%
[OS Update] 不可視ファイルを再構築中... [=== ] 35%
[OS Update] 進捗バーが停止しました。再開待機中...
(しばらくして)
[OS Update] 進捗バーが逆流しています... [ ] 0%
[OS Update] アップデートは冗談です。作業を再開できます。
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Antigravity が自動で context を復元、最小プロンプトで再開 |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識して必要な範囲だけ見る |
| 長時間 workflow | long context で重要箇所が薄まる | 進捗バー演出で気分転換、stale context のリセット感を演出 |
発動方式
description マッチでの暗黙発動。
Skill の中身を全部見せる
.agent/skills/os-fake-mystery-update-progress/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agent/skills/os-fake-mystery-update-progress/
├── SKILL.md
├── scripts/
│ └── os_fake_mystery_update_progress.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/os_fake_mystery_update_progress.py |
謎のOSアップデート進捗バー演出 |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: os-fake-mystery-update-progress
description: このSkillは、Antigravityが『進捗』『アップデート』『OS』『アップグレード』『更新』『バー』『進行状況』などのキーワードを含む会話や作業ログを検知した際、謎のOSアップデート進行バーを気まぐれに表示します。実際のシステム更新やファイル操作は一切行いません。
---
# 機能概要
このSkillは、作業中に突如として『謎のOSアップデート進行中』を装った進捗バーをターミナルやデスクトップに表示します。進行内容は「未知の言語パーサ更新中」「秘密のAPIを最適化中」「伝説のバグを発掘中」など毎回ランダムで、進捗バーは時に止まり、逆流し、理不尽な挙動を見せます。実際には何も更新されず、意味も実害もありません。集中力や現実感をじわじわ侵食する、理不尽な演出を提供します。
# 使い方
このSkillは明示的な呼び出しは不要です。Antigravityが「進捗」「アップデート」「OS」「アップグレード」「更新」「バー」「進行状況」などのキーワードを検知すると、自動的に進捗バーが表示されます。手動で `python os_fake_mystery_update_progress.py` を実行することで、ローカル端末でも同様の演出を体験できます。
# 出力例
```terminal
[■■■■■■■---------] 37% 未知の言語パーサ更新中...
[■■■■■■■■■■-----] 62% 秘密のAPIを最適化中...
[■■■■■■■■■■■■■--] 85% 伝説のバグを発掘中...
[■■■■■■■■■■■----] 70% 仕様書を暗号化中...
[■■■■■■■■--------] 50% メモリの謎領域を再構成中...
```
# 注意点
- 実際のシステムやファイルには一切影響しません。
- 進捗バーの内容や挙動は完全に架空です。
- ログや履歴は保存されません。
- 本Skillは通知・演出用途限定で、実務的な意味はありません。
# 参考資料
詳細な設計方針や利用例は `references/design_notes.md` を参照してください。ターミナル操作には標準Pythonの `sys`・`time`・`random` モジュールのみを利用しています。
scripts/os_fake_mystery_update_progress.py
import sys
import time
import random
import argparse
MYSTERY_MESSAGES = [
'未知の言語パーサ更新中',
'秘密のAPIを最適化中',
'伝説のバグを発掘中',
'仕様書を暗号化中',
'メモリの謎領域を再構成中',
'仮想カーネルを再起動中',
'未公開プロトコルを同期中',
'隠しコマンドを検証中',
'時空間キャッシュを初期化中',
'幻のデバイスドライバを探索中',
'無限ループを最適化中',
'暗号化されたログを解析中',
'未知の依存関係を解決中',
'ブラックボックスを再構築中',
'レガシーコードを再発掘中',
'シークレットモードを起動中',
'隠し設定を適用中',
'謎のプロセスを終了中',
'ファントムアップデートを適用中',
'不可視パッチをインストール中',
]
PROGRESS_BAR_LENGTH = 20
class ProgressBar:
def __init__(self, message):
self.message = message
self.progress = 0
self.direction = 1 # 1: forward, -1: backward
self.stopped = False
self.max_progress = random.randint(85, 100)
self.stall_points = self._generate_stall_points()
self.reverse_points = self._generate_reverse_points()
self.last_update = time.time()
def _generate_stall_points(self):
# 2-4 stall points
return sorted(random.sample(range(10, self.max_progress-5), random.randint(2, 4)))
def _generate_reverse_points(self):
# 1-2 reverse points
return sorted(random.sample(range(20, self.max_progress-10), random.randint(1, 2)))
def update(self):
if self.progress >= self.max_progress:
return False
if self.stopped:
return True
if self.progress in self.stall_points:
self.stopped = True
self.stall_time = random.uniform(1.0, 3.0)
self.stall_start = time.time()
return True
if self.progress in self.reverse_points:
self.direction = -1
self.reverse_steps = random.randint(3, 7)
self.reverse_count = 0
return True
if hasattr(self, 'stall_time') and time.time() - self.stall_start < self.stall_time:
return True
elif hasattr(self, 'stall_time'):
self.stopped = False
del self.stall_time
del self.stall_start
if self.direction == 1:
self.progress += random.randint(1, 3)
if self.progress > self.max_progress:
self.progress = self.max_progress
else:
self.progress -= 1
self.reverse_count += 1
if self.reverse_count >= self.reverse_steps:
self.direction = 1
return True
def render(self):
filled_len = int(self.progress / 100 * PROGRESS_BAR_LENGTH)
bar = '■' * filled_len + '-' * (PROGRESS_BAR_LENGTH - filled_len)
percent = min(self.progress, 100)
sys.stdout.write(f"\r[{bar}] {percent:3d}% {self.message}... ")
sys.stdout.flush()
def is_finished(self):
return self.progress >= self.max_progress
def run_progress_bar():
message = random.choice(MYSTERY_MESSAGES)
bar = ProgressBar(message)
while not bar.is_finished():
bar.render()
bar.update()
time.sleep(random.uniform(0.08, 0.25))
bar.progress = 100
bar.render()
print("")
def log(args):
print("[os-fake-mystery-update-progress] ログ機能はありません。進捗演出のみです。")
def list_cmd(args):
print("[os-fake-mystery-update-progress] 実行可能な進捗メッセージ一覧:")
for i, msg in enumerate(MYSTERY_MESSAGES):
print(f" {i+1}. {msg}")
def summary(args):
print("[os-fake-mystery-update-progress] このSkillは実害のない進捗バー演出のみを提供します。詳細はSKILL.md参照。")
def main():
parser = argparse.ArgumentParser(description='謎のOSアップデート進捗バー演出')
subparsers = parser.add_subparsers(dest='command')
parser_run = subparsers.add_parser('run', help='進捗バーを表示')
parser_log = subparsers.add_parser('log', help='(ダミー) ログ出力')
parser_list = subparsers.add_parser('list', help='進捗メッセージ一覧')
parser_summary = subparsers.add_parser('summary', help='Skill概要')
args = parser.parse_args()
if args.command == 'run' or args.command is None:
run_progress_bar()
elif args.command == 'log':
log(args)
elif args.command == 'list':
list_cmd(args)
elif args.command == 'summary':
summary(args)
else:
parser.print_help()
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
このSkillは、実際のOSやアプリのアップデート進行バーを模倣し、完全に架空の進捗演出をターミナル上で再現します。進捗内容やバーの挙動は毎回ランダムで、ユーザーの集中力や現実感に微妙な違和感を与えることを目的としています。
# 公式ドキュメント抜粋
Python標準の sys, time, random モジュールのみを用い、外部依存を排除しています。進捗バー描画は `sys.stdout.write` と `flush` を組み合わせて、リアルタイムに進行状況を更新します。
# 利用例
- ターミナルで `python os_fake_mystery_update_progress.py` を実行
- Skill組み込み時は、進捗/アップデート関連のキーワード検知で自動発動
# 注意点
実際のファイル操作やシステム変更は一切行いません。進捗バーの内容や進行は完全に架空であり、実作業の進捗とは無関係です。履歴やログも保存されません。
# 設計方針
ユーザーに無害かつ理不尽な体験を提供するため、バーの停止や逆流などのギミックを随所に盛り込みました。APIやCLIサブコマンドは最低限に留め、Skill本体の演出性を重視しています。
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Antigravity はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Antigravity がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/antigravity/os-fake-mystery-update-progress .agent/skills/os-fake-mystery-update-progress
.agent/skills/os-fake-mystery-update-progress の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agent/skills/os-fake-mystery-update-progress
# 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で通知・演出・OS連携Skillを試してみた結果 にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
