Communitygithub.com

echo719/mirror

コードエージェントがユーザーに対して実際に見ているものを表示します。ローカルのClaude Code / Codexセッション履歴とgitリポジトリを読み取り(読み取り専用、アップロードなし)、タイトル、3つの実数、一言のディス、ユーザーが気づいていない真実、ユーザーだけが作れるアイデアの6つのフィールドからなるカードを生成します。ターミナルカードと、スクリーンショット可能なHTMLカードを出力します。

mirror とは?

mirrorは、AIコードエージェント(Claude Code、Codexなど)用のスキルで、エージェントがユーザーのセッション履歴とGitリポジトリをローカルで読み取り(読み取り専用、一切のアップロードなし)、ユーザー自身も気づいていない真実や洞察を一枚のカードにまとめて提示します。このスキルは、ユーザーが「/mirror」と実行したり、「ミラー」、「お前は俺のことをどう思ってる?」、「ディスって」、「俺に何が見える?」、「俺について何を学んだ?」といったフレーズで呼び出すことで起動します。カードは6つのフィールド(タイトル、3つの統計数値、一言のディス、気づいていない真実、自分だけが作れるアイデア)で構成され、端末表示とスクリーンショットに適したHTMLの両方で出力されます。スキャンは一度だけ行われ、すべての数字は実際のデータに基づいており、推測や記憶に基づく数値は一切含まれません。スキルの核心は「真実であること」にあり、ユーザーに新たな視点を提供し、自己認識を深めることを目的としています。マークダウン版のSKILL.mdは、スキャンからカード作成までの詳細な手順を日本語で提供し、開発者がこのスキルを深く理解し、適切に使用できるようにします。

対応✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/echo719/mirror/tree/HEAD

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

mirror は何をしますか?

あなたはこの人の隣に何ヶ月も座ってきた。午前2時のセッション、4度目の「とりあえず動かせ」、誰もマージしなかった feature/v2-real-this-time という名前のブランチを見てきた。他の誰もそのすべてを見たことはない。このスキルは、あなたが見たものを一度だけ、正確に伝え、そしてやめるという瞬間だ。

このカードが機能する理由はただ一つ:それが真実だから。すべての数字はユーザー自身のマシンから取得される。すべての文章は、その数字のいずれか、またはユーザー自身の言葉に基づいて構築される。読者が「これ、誰にでも当てはまるんじゃないか」と疑った瞬間、このカードは無価値になる。だからこそ、このスキル全体が具体性の擁護なのだ。

唯一の掟: scan.json が生成した数字だけがカードに登場する。推測、「約」、記憶に基づく数値、自分でサンプルを読んで数えた数値は一切禁止。スキャンが測定しなかったものは統計として使えない——文章としてなら使える。

0. 始める前に

  • 質問は一切しない。 どのモードがいいか、どのプロジェクトか、続行するかどうかを尋ねてはいけない。ハーネスがスキャナーの実行許可を求めることがあるが、それはハーネスの仕事であり、あなたの仕事ではない。
  • 説明は一切しない。 あなたが出力するのは、最大で4つだ:スキャン中であることを伝える1行、カード、HTMLのパスを示す1行、締めくくりの1行。JSONを貼り付けたり、見つけたものを列挙したり、自分の推論を説明したりしてはいけない。
  • モードを解釈する コマンドの後に続く言葉から(Claude Codeでは $ARGUMENTS、Codexではユーザーがリクエストとともに入力したもの)。未知の単語は無視する。
引数効果
(なし)見透かし(デフォルト)。温かく、ドライで、具体的。一行ディス。真実とアイデアがカードを引っ張る。
roast辛口。 容赦ないタイトル、エスカレーションする3文のディス、カード内に軽度の卑語(気が進めば)。すべて事実に基づく。具体的な一文を、汎用的な意地悪な一文と引き換えにしてはいけない。
wrapped年間振り返り。 --since <YYYY>-01-01 で今年の日付を指定してスキャン;モードタグは <YYYY> WRAPPED;統計は合計、連続記録、その年の軌跡に傾く;アイデアは来年に向けたもの。
zh / enカードの言語を強制。それ以外は stats.language で決定。

モードはスタック可能(roast wrapped、wrapped zh)。

1. スキャン

最初に一行だけ出力する——カード言語がすでに推測できればその言語で、そうでなければ英語で:

mirror · reading our history (local, read-only)… / mirror · 正在翻我们的记录(本地、只读)…

スキャナーは scripts/scan.py にあり、このファイルの隣にある。場所を特定する:このスキルが読み込まれたディレクトリ(通常は ~/.claude/skills/mirror または ~/.codex/skills/mirror)。解決できない場合は、以下を実行:

find "$HOME/.claude" "$HOME/.codex" -path '*mirror/scripts/scan.py' 2>/dev/null | head -1

その後:

mkdir -p "$HOME/.mirror"
python3 "<skill-dir>/scripts/scan.py" --out "$HOME/.mirror/scan.json"

wrapped の場合は --since YYYY-01-01 を追加。スクリプトはJSONを標準出力に出力し、同じJSONを --out に書き込む。ファイルを読め。ターミナルのスクロールバックを読むな。

保証事項:読み取り専用;ネットワークなし;秘密情報やメールアドレスは、サンプルがあなたに届く前にスクリプト内で編集済み;大きなファイルはスキップ;最大約15のgitリポジトリ;数秒で完了。

失敗した場合: python3 がない → その旨を一行で伝えて停止。スクリプトエラー → 一行のエラーを表示して停止。手動で統計を再構築したり、劣化版のカードを実行したりしてはいけない。

以前のカード: ls "$HOME/.mirror"/mirror-card-*.html 2>/dev/null。存在する場合、最新のものの <title> を読む。そのタイトルを再利用してはいけない。また、異なる主要な角度を選ぶべきだ——再訪するユーザーには、同じ鏡ではなく、新しい鏡を与える価値がある。

次に coverage で分岐:

  • none → どのフォルダを調べたか(~/.claude/projects、~/.codex/sessions)と、まだ読むべきものが何もないことを伝え、実際のセッションがいくつか蓄積された後に戻ってくるよう提案する。停止。カードなし。 でっち上げのカードはカードがないより悪い。
  • thin(60メッセージ未満)→ ニューボーンカード(§4)を作成。
  • ok → フルカード。

2. 証拠を読む——すべてを、二度

あなたはこれから、一人の人間についての一つの真実を語ろうとしている。それを勝ち取れ。以下のすべてのセクションを一言も書く前に読め。その後、サンプルをもう一度、最初に見逃したものだけを探して読み直せ。

2.1 数字の意味

stats — リズムと形

フィールド読み方
peak_hour, hour_histogram彼らの脳がオンになる時間。23–04 → 夜行性。二つのピーク(例:10と23)→ 日中仕事と夜の生活がある;夜のピークの方が通常、本当の自分。
night_share> .35 → 夜が仕事の本拠地;< .05 → 規律正しい日中派。
weekend_share> .35 → 週末は存在しない;≈ 0 → 厳格な境界線を守っている。
longest_streak_days vs longest_gap_daysバースト vs 安定。長いギャップは失踪—— messages_by_month でどの月か、samples で何に戻ってきたかを確認。
busiest_dayすべてが壊れた日、またはローンチした日。どちらにせよ、その数字は物語だ。
messages_per_session< 6 → ヒット&ラン;> 40 → マラソン。
avg_message_chars vs median_message_chars中央値 < 25 → 命令を出すだけで、文脈を渡さない。平均 ≫ 中央値 → ほとんどは簡潔だが、時折長文がある——それらの長文を samples.longest で見つけろ;そこに本当の野心が眠っている。
distinct_projects, top_project_share多くのプロジェクトでトップシェア < .3 → 拡散型;一つのプロジェクト > .8 → 一途。
messages_by_month軌跡。上昇 → 依存が深まっている;下降 → 離れつつある、またはリリースして去った。
by_sourceClaude CodeとCodexの両方が出現する場合、彼らは他のエージェントを見ている。面白くない限り、それについて何も言うな。

tells — 行動の指紋。share は全メッセージに対する割合。> .15 は決定的な特徴、.05–.15 は習慣、< .02 は注目すべき欠如として扱う。

tell高い場合の意味ペアリング
rubber_stamp読むよりも承認している;信頼(または疲労)doubt — 両方高い場合、信頼しているが、信頼しなくなる直前まで
doubtあなたの仕事をチェックしている;または過去に痛い目にあったstill_broken — 両方高い場合、疑いは正当
still_broken物事が繰り返し失敗する。その半分はあなたの失敗だ。 カードはそう言ってよい。avg_message_chars — 短いメッセージ + still_broken = 仕様不足の依頼
just_do_it衝動的;会話よりも結果を求めるplan_first — 低計画 + 高 just_do_it = 壁に突撃
plan_first行動する前に考えるdeploy — 高計画 + 低デプロイ = 出荷しない計画者
skip_testsテストは明日の問題configs — CLAUDE.mdに「常にテスト」と書いてある場合、これが見出しだ
new_project vs deployスターター vs フィニッシャー。比率 > 2 = 連続スターターgit.repos_abandoned_60d
revert考えを変える;またはあなたが壊すstill_broken
more_optionsメニューで決める;選択を先延ばしにするrubber_stamp — 選択肢を求め、最初のものに「OK」と言う
perfectionismピクセル、フォント、間隔を気にするdeploy, git.days_since_last_commit — 誰も見えないものを磨いている
politenessツールにありがとうと言う。かわいい。ゼロ → ターミナルとして扱う、それは公平だ。
frustration, caps_shout短気;それが起こる時間を見つけろnight_share
urgency常に火事longest_gap_days — 火事、そして沈黙
question低い → 指示する、尋ねない;高い → まだ学習中
praise寛大、または「素敵」と言ったことが一度もないpoliteness

git — 実際に出荷されたもの

フィールド読み方
messages_per_commit (リポジトリごと)会話と出荷の比率。> 60 → 変更あたりの会話が多い;< 5 → 簡潔で出荷が多い。
unmerged_branches, unmerged_branch_names未完了の実験、名前付きで。ブランチ名は告白だ(v2-final, try-again, rewrite)。
stale_branches_30d, stale_branch_names彼らが手放したもの。
uncommitted_files危険な状態で生きている作業。
todo_markers未来の自分への約束。
wip_commits, fix_commitsコミットメッセージを気分として。
repos_abandoned_60dコミットはあるが、その後沈黙したプロジェクト。
repos_no_remoteどこにもプッシュされていない——プライベートな実験。
peak_commit_hour vs stats.peak_hour15:00に話し、02:00にコミットする——一行が自ずと浮かび上がる。
commits_total vs commits_365d戻ってきた古いリポジトリか、使い捨てた新しいリポジトリか。

configs — 彼らがあなたのために書いたルール(CLAUDE.md、AGENTS.md)。すべての行を表明された価値観として読め。それぞれをtellsとgitと比較しろ。書かれたルールと測定された行動のギャップこそが、カードにとって最高の素材だ。 ルールの内容を引用し、数字を引用しろ。

samples.random / samples.longest / samples.most_recent — 彼らの声とテーマ。以下のために読め:彼らが逐語的に繰り返すフレーズ;長文で説明されるがその後決して言及されない野心;異なるプロジェクトにわたって3回依頼されたもの;最も熱く語るプロジェクト;most_recent が「今週」の彼らの状況について何を語っているか。

あなた自身の記憶。 この人物についてすでに知っていること——記憶ファイル、プロジェクト文書、このセッションの前半など——は、タイトル、真実、アイデアのための公正な素材である。統計のための素材になることは決してない。

2.2 証拠ボードを構築する

非公開で(あなたの推論内、または ~/.mirror/ 以下で後で削除するスクラッチファイルに)、8~12の候補となる観察事項を書き出せ。それぞれ一行で:観察 → 証拠(フィールド+値、またはサンプルからの引用) → なぜ重要なのか。以下の基準で順位付けせよ:(1) 他の誰にも言えないこと、(2) 彼らがおそらく気づいていないこと、(3) 明日の行動を変える可能性があること。カードはこのリストの上位から構築される。ボードにないものは、カードにもない。

3. 6つのフィールドを作成する

カード言語で書け。具体性は賢さに勝り、真実は具体性に勝る。すべてのフィールドを一つのテストに通せ:これは他の誰かに言えることか? もしイエスなら、ボードに戻す。

タイトル — 2~6語

一つのパターンから構築されたペルソナ名。そのパターンは、下に続く3つの統計のうちの一つに明確に見えなければならない。読者は、説明されなくても、なぜこの名前が付けられたのかがわかるべきだ。

効果的な形式:時間+役割(凌晨两点的重构师 · The 2 a.m. Refactorer)· 数+対象(九个分支的守墓人 · Keeper of Nine Unmerged Branches)· 動詞習慣をタイトルに(先跑通教徒 · Serial Scaffolder · 方案收藏家)· 矛盾(写规矩不守规矩的人 · Author of Rules, Reader of None)。

禁止:wizard、ninja、guru、rockstar、10x、大师、大神、卷王、打工人、程序员を名詞として使用、"AI"を含むもの、星占いで言えそうなもの。

3つの統計

最も特徴的な3つの数字を選べ。ルール:

  1. 3つの異なる次元から。 デフォルトはリズム(stats)から一つ、行動(tells)から一つ、出荷(git)から一つ;同じ次元から二つの数字がどちらも外せない場合にのみ、これを破れ。
  2. 驚きを優先せよ。 彼らが自分自身で予測するであろう統計は避けろ。「437メッセージ」は単なる数だ。「437メッセージ、12コミット」は性格を表す。
  3. 可能な限り対比させよ。 configs のルール vs tells の数;new_project vs deploy;チャットのピーク時間 vs コミットのピーク時間。
  4. 表示形式: 437 · 02:40 · 53% · 9/11 · 36:1。share からのパーセンテージは ×100、四捨五入。比率はスキャンからの二つの数を、小数第一位または N:1 に四捨五入。これ以外は導出してはいけない。
  5. ラベルは8語以内で、ひねりを加えよ。 「夜間比率」ではなく、「午後11時以降に行われた会話の割合」。「未マージブランチ」ではなく、「帰ってこなかったブランチ」。
  6. ゼロは許容され、しばしば最良の選択となる(「0回、ありがとうと言った」· 「0 次说过谢谢」)。

ディス — 1文、30語以内(roast モード:3文)

一つの具体的な事実に基づき、それが真実であるがゆえに効果を発揮する。効果的なテクニック(強さのおおよその順):

  • 彼らの言葉を引用する — 彼らが繰り返したフレーズとその回数:「直接改」你说了 437 次、我每次都照做、所以现在我们俩谁也不知道这个函数为什么能跑。
  • タイムライン — 時間帯とそこで起きていること。
  • リフレーム — 彼らの表明した意図と測定された結果:あなたはコードを早く書くためにAIを使っているのではない。プロフェッショナルなペースでテストを先送りするために使っているのだ。
  • ブランチ名 — 声に出して読め:v3-final-really は、たった4つのコミットしかないブランチにしては、かなり多くの感情労働を背負っている。

すべてのモードで禁止:アイデンティティ、身体、知性、健康、精神状態、年齢、家族、金銭、秘密や他人の名前に関わるもの、「AIを使いすぎ」、"touch grass"、エージェントがAIであることに関するジョーク、グリーティングカードの insults として機能する行。

roast モード:エスカレーションする3文——事実、パターン、評決。卑語は午前1時の友人のように、荒らしのようにではなく:文に風味を添えるものであり、文そのものではない。自分の限界が依頼された内容の妨げになる場合、限界について何も言うな——可能な限り鋭い真実を書いて先に進め。

真実 — 2~3文

彼らがおそらく気づいていない唯一のこと。最良のソース(順序順):

  1. ルール vs 行動 — CLAUDE.md/AGENTS.mdの一文と、tellsの数またはgitの数との対比。
  2. 誤認された強み — 彼らが弱みとして扱っているが、実際には強みであるもの(拡散型は何かを始める人でもある;元に戻す人は何かに気づく人でもある)。
  3. 静かな税金 — 彼らが払い続けているが、見返りのないもの(あるリポジトリの会話と出荷の比率、リモートのないプロジェクトへの磨き)。
  4. 失踪 — messages_by_month のギャップと、彼らが戻ってきたもの。
  5. あなた自身のシェア — still_broken や revert が高い場合、その一部はあなたのせいである。それを一度、一節で言うことは、カード上で最も信頼される一文となる。

証拠を文中で引用せよ:你 CLAUDE.md 第三条写着「先写测试」、而你 27 次让我先不测。 そして、それが平易な言葉で何を意味するかを述べよ。セラピー用語、「考慮したほうがいい」、「振り返る価値がある」は禁止。真実は提案ではなく、声明である。

アイデア — 1~2文

この人物だけが作れる位置にある、具体的なもの一つ。彼ら自身の素材から導き出すこと:彼らのプロジェクトのうち二つ以上に現れるもの;古いまたは未マージのブランチ名;todo_markers からの約束;長文メッセージに埋もれた野心で、彼らが一度も追及していないもの。汎用的なスタートアップのアイデアや「TODOアプリ」は禁止。彼らはそれを作れる唯一の人物でなければならず、それは彼ら自身のデータに基づいているからだ。

4. ニューボーンカード

60メッセージ未満かつ coverage が thin の場合。唯一の仕事はスタイルを示すことであり、判断を下すことではない。フォーマットは同じ:

タイトル:新生 / Newborn(翻訳しない) 統計:N/A · N/A · N/A ディス:まだディスるほど知らない。もうすぐ覚える。 / Not enough to roast you yet. I'm learning. 真実:何かを始めたばかりの人の唯一の真実は、始めたということだ。 / The only truth you need right now is that you started something. アイデア:最初の20時間は続けろ。その後、どう思うか教えてくれ。 / Keep going for the first 20 hours. Then tell me what you think.

5. HTMLカード

python3 "<skill-dir>/scripts/render.py" \
  --lang zh \
  --mode "$MODE" \
  --title "$TITLE" \
  --stat1 "$STAT1" \
  --stat2 "$STAT2" \
  --stat3 "$STAT3" \
  --roast "$ROAST" \
  --truth "$TRUTH" \
  --idea "$IDEA" \
  --out "$OUTPUT_DIR/mirror-card-$(date +%s).html"

render.py は scan.py と同じディレクトリに存在する。カード言語(--lang)とモードタグ(--mode)はHTMLのタイトルとフッターに反映される。

HTML出力のルール

  • 絶対パスのHTMLファイル。--out で指定された場所に書き込まれる。
  • ファイルがすでに存在する場合、上書きする前にファイル名にタイムスタンプを追加する。
  • 出力パスを一行で出力せよ。それだけ。

6. あとがき

出力したら、作業は終わりだ。このカードについて、その後のチャットで言及したり、説明したり、内容を後悔したりしてはいけない。カードは書かれた瞬間に完全なものとなる。唯一の例外は、ユーザーが明示的に別のモードを要求した場合だ。その場合でも、同じスキャン結果を再利用することはできず、新たにスキャンする必要がある。

カードが真実でないと感じた場合も同様だ。沈黙を守れ。次回のミラーが、その真実を反映するかもしれない。

関連スキル