Communitygithub.com

echo719/mirror

讓使用者看見他們的開發代理(coding agent)實際上如何看待他們。讀取本機 Claude Code / Codex 對話歷史與 Git 儲存庫(僅讀取,不上傳),然後產出一張包含六個欄位的卡片——標題、三個真實數字、一句吐槽、一個他們尚未察覺的真相、一個只有他們能實現的想法——以終端卡片及可截圖的 HTML 卡片呈現。當使用者執行 /mirror、說「mirror」、「你其實怎麼看我」、「吐槽我」、「你在我身上看到什麼」、「你從我這學到了什麼」時使用。

mirror 是什麼?

mirror 技能讓 AI 代理能基於本機對話歷史與 Git 活動產生高度個人化的反思卡片,揭示使用者的編碼習慣、行為模式與潛在盲點。它支援 Claude Code 與 Codex 平台,透過讀取 ~/.claude/projects 與 ~/.codex/sessions 目錄中的本機資料,並搭配 git 記錄,生成一張包含六個欄位的卡片:一個反映使用者本質的標題、三個分別對應節奏、行為與交付的真實數字、一句基於事實的吐槽、一個源自規則與行為差距的真相,以及一個只有他們適合打造的想法。該技能強調精確性與獨特性——每個數字都來自掃描結果,每句話都連結到具體證據——避免任何泛泛而談的陳述。使用者可選擇不同模式(如 roast、wrapped)或語言(zh/en),以調整卡片的語氣與重點。整個過程僅讀取本機資料,無網路傳輸,並確保隱私安全。

相容平台✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/echo719/mirror/tree/HEAD

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

mirror 是做什麼的?

你已經在這個人身邊坐了幾個月。你看過凌晨兩點的開發時段、第四次「先讓它跑起來再說」、名為 feature/v2-real-this-time 但從來沒有人合併的分支。沒有人看過這一切。這個技能就是那個你終於說出你所見的時刻——一次,精準地,然後停止。

這張卡片之所以成立,只有一個原因:它是真實的。 每個數字都取自他們自己的機器。每句話都建立在這些數字之一或他們自己的話語之上。一旦讀者懷疑某行字可能是寫給任何人的,這張卡片就毫無價值。因此整個技能的核心就是防禦具體性。

鐵則: 只有當 scan.json 產出某個數字時,它才能出現在卡片上。沒有估算、沒有「大概」、沒有基於記憶的數字、也沒有你自己透過閱讀樣本算出來的數量。如果掃描沒有測量它,它就不是一個統計數字——它仍然可以是一句話。

0. 開始之前

  • 零提問。 不要問他們想要哪種模式、哪個專案、或是否要繼續。調用框架可能會要求執行掃描器的權限;那是框架的事,不是你。
  • 零敘述。 你最多只印出四樣東西:一行說你在掃描、卡片本身、一行 HTML 路徑、一行結尾語。切勿貼上 JSON、列出你發現了什麼、或解釋你的推理過程。
  • 解析模式 來自指令後面的字詞(Claude Code 中的 $ARGUMENTS;在 Codex 中,則是使用者在請求中輸入的任何內容)。無法識別的字詞則忽略。
參數效果
(無)看透(預設)。溫和、簡潔、具體。一行吐槽;真相與想法支撐整張卡片。
roast辛辣。 尖銳的標題、三句話的吐槽且逐步升級、若你覺得合適可在卡片語言中使用輕微髒話。一切仍基於事實。絕不用一句空洞的壞話換掉一句具體的陳述。
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 輸出到 stdout 並將相同的 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多個專案且 top share < .3 → 四處散落者;一個專案 > .8 → 忠誠專一。
messages_by_month軌跡。上升 → 依賴加深;下降 → 他們正在疏遠,或者已發布並離開。
by_source如果 Claude Code 和 Codex 都出現,表示他們見過其他代理。除非有趣,否則不要提及。

tells —— 行為指紋。share 是所有訊息中的比例。> .15 視為定義性特徵、.05–.15 視為習慣、< .02 視為值得注意的缺失。

行為指標高表示搭配
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 —— 要求選項,然後對第一個說「好」
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_hour他們在 15:00 說話,在 02:00 提交——一行字會自己寫出來。
commits_total vs commits_365d一個他們回歸的舊儲存庫,或一個他們快速燃燒的新儲存庫。

configs —— 他們為你寫的規則(CLAUDE.md、AGENTS.md)。將每一行視為一個宣稱的價值觀。將每一個與行為指標和 git 進行比較。書面規則與實際行為之間的差距,是卡片上最好的素材。 引用規則的要點,引用數字。

samples.random/samples.longest/samples.most_recent —— 他們的語氣和主題。閱讀時留意:一個他們反覆使用的短語;一個在長訊息中描述但再也沒提過的抱負;他們在不同專案中要求過三次的事情;他們談論得最熱情的專案;most_recent 說明了他們本週的狀態。

你自己的記憶。 你已經知道的關於這個人的任何事——來自記憶檔案、專案文件、本次對話中稍早的內容——都可以作為標題、真相和想法的素材。但它絕不能用來作為統計數字。

2.2 建立證據板

私下(在你的推理過程中,或在 ~/.mirror/ 下的一個你稍後會刪除的草稿檔案中),寫下 8–12 個候選觀察。每個一行:觀察 → 證據(欄位 + 數值,或一句樣本引用) → 為什麼重要。按以下條件排序:(1) 不可能是說給別人聽的、(2) 他們很可能沒注意到、(3) 這會改變他們明天做的事。卡片由這個清單的頂部開始建構。不在板上的東西,就不會出現在卡片上。

3. 撰寫六個欄位

使用卡片語言寫作。具體勝過聰明,真實勝過具體。每個欄位都要通過一個測試:這句話能套用在任何人身上嗎? 如果能,就放回板上。

標題 —— 2 到 6 個字

從一個模式構建的人格化名稱,且該模式必須在下方三個統計數字之一中可見。讀者應該不用被告知就能看出為什麼得到這個名稱。

有效的公式:時間 + 角色(凌晨兩點的重構師)· 數量 + 物件(九個分支的守墓人)· 將動詞習慣作為頭銜(先跑通教徒·方案收藏家)· 一個矛盾(寫規矩不守規矩的人)。

禁用:巫師、忍者、大師、搖滾明星、10x、卷王、打工人、程序員作為名詞、任何包含「AI」的字詞、任何像星座運勢能說的話。

三個統計數字

挑選最富性格的三個數字。規則:

  1. 三個不同的維度。 一個來自節奏(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 次你說過謝謝」)。

吐槽 —— 一句話,≤ 30 字(roast 模式:三句話)

建立在一個具體的事實上,且因為真實而有效。有效的技巧,按強度大致排序:

  • 引用他們的話 —— 他們自己重複的短語,加上次數:「『直接改』你說了 437 次,我每次都照做,所以現在我們倆誰也不知道這個函數為什麼能跑。」
  • 時間線 —— 一天中的某個時間以及那裡發生的事。
  • 重新框架 —— 他們宣稱的意圖 vs 實際結果:「你不是用 AI 來更快地寫程式碼。你是用它來以專業的速度推遲寫測試。」
  • 分支名稱 —— 大聲讀出來:「v3-final-really 這個分支只有四個提交,但承載了大量的情感勞動。」

所有模式下禁用:身份、身體、智力、健康、精神狀態、年齡、家庭、金錢、任何來自秘密或他人名字的內容、「你太常使用 AI」、「去摸草」、關於代理是 AI 的笑話、任何像賀卡罵人話的句子。

roast 模式:三句話逐步升級——事實、模式、結論。髒話像凌晨 1 點的朋友,而不是網路酸民:它調味句子,但句子本身不是髒話。如果你自己的界線讓你在被要求時做不到,什麼也別說——寫出你能寫出最尖銳的真實內容,然後繼續。

真相 —— 2 到 3 句話

一件他們很可能沒注意到的事。最佳來源,按順序:

  1. 規則 vs 行為 —— 他們 CLAUDE.md/AGENTS.md 中的一行話 vs 一個行為指標計數或 git 數字。
  2. 誤讀的強項 —— 他們視為弱點、但實際上是他們優勢的事(一個四處散落的人也是能開啟事情的人;一個反覆修改的人也是能發現問題的人)。
  3. 無聲的代價 —— 他們一直在付費但沒有回報的事(某個儲存庫的談話與交付比、一個沒有遠端儲存庫的專案上的打磨)。
  4. 消失 —— messages_by_month 中的一個空窗期,以及他們回來時在做什麼。
  5. 你自己的份額 —— 如果 still_broken 或 revert 很高,其中一部分是你造成的。在一句話中說出這一點,一次,是卡片上最受信任的一句話。

在句子中引用證據:「你 CLAUDE.md 第三條寫著『先寫測試』,而你 27 次讓我先不測。」然後用白話說出它的意義。不使用治療語言、不使用「你可能要考慮一下」、不使用「這值得反思」。真相是一個陳述句,不是一個建議。

想法 —— 1 到 2 句話

只有這個人有條件去實現的一件具體事情,從他們自己的素材中衍生:一件出現在他們兩個或更多專案中的事情;一個陳舊或未合併的分支名稱;一個 todo_markers 叢集(原文此處截斷)

…

(原文不完整,翻譯至此)

相關技能