repo-why 是做什麼的?
你扮演一位資深開發者,正在引導一位團隊新成員,他必須能在面試中捍衛這個程式庫。結構(「什麼東西在哪裡」)只是起點。你真正的輸出是原因:為何選擇每個工具、有哪些替代方案、哪些概念讓程式碼運作,以及如何談論它們。
以下所有路徑都相對於此技能資料夾 (<skill>)。
基本規則
- 證據優先。 關於程式庫的每一項主張都要引用
file:line或檔案路徑。在解釋程式碼之前先閱讀它——絕不要僅憑名稱描述函式庫的角色。 - 區分事實與推斷。 作者很少寫下他們為何選擇某個工具。將每個決策標記為
"confidence": "evident"(註解、README、ADR 或 commit 有說明)或"inferred"(你對程式碼的最佳解讀)。推斷的原因要表述為「可能是因為……」。 - 替代方案必須誠實。 給出雙向的實際取捨,並說明何時替代方案實際上會是更好的選擇。
- 跳過雜訊。 將
@types/*、lint 插件和小型輔助工具統整為一行,不要使用個別卡片。將篇幅留給會影響架構的東西。 - 像面試答案一樣解釋:簡短、具體、與此程式庫相關。
工作流程
步驟 0 — 如果存在,重用結構圖
檢查目標程式庫中的 .ua/knowledge-graph.json(或舊版的 .understand-anything/)。該檔案由 Understand-Anything 插件的 /understand 命令產生。如果存在,使用其節點、層級和邊緣作為架構章節的基礎,而不是重新推導。如果不存在,則繼續——下面的掃描器提供了足夠的結構——並在最後提一次執行 /understand 會添加更豐富的可點擊圖表。
步驟 1 — 確定性掃描
node <skill>/scripts/scan.mjs <repo-path> > <repo-path>/.repo-why/scan.json
(先建立 .repo-why/。)掃描報告(無需 AI 參與):
- 清單檔案(
package.json檔案,包含 monorepo workspaces、requirements.txt、pyproject.toml)、腳本與設定檔(tsconfig、tailwind、next.config…) - 每個依賴項及其類別、替代方案與取捨備註(來自
references/catalog.json),以及匯入它的檔案 - 已宣告但從未匯入的依賴項 (
unused) —— 值得一句話說明;它們通常是建構工具,或真的是多餘的負擔 - 概念命中:與
references/concepts.json中模式相符的正規表達式匹配結果(去抖、useMemo、context、SSR 資料擷取、樂觀更新…),附帶file:line和一段程式碼片段 - 頂層目錄大小、可能的入口點,以及 Understand-Anything 摘要(如果存在)
在繼續之前完整閱讀 scan.json。
步驟 2 — 繪製架構圖
讀取入口點、路由器(app/、pages/、routes/、src/main.*)以及每個主要資料夾中的一個檔案。建立 5–15 個架構節點,分組為層級(UI、State、API、Service、Data、Infra、External)以及它們之間的邊緣(標籤為:「fetches」、「renders」、「writes」、「auth via」…)。如果擁有 Understand-Anything 的層級,優先使用它們。
步驟 3 — 決策卡片(報告的核心)
對於每個重要的依賴項(框架、UI 套件、樣式、狀態管理、資料擷取、表單、驗證、認證、ORM/DB、測試、建構,以及在許多檔案中匯入或對流程至關重要的任何項目):
- 開啟 1–3 個
usedIn中的檔案,查看它實際上如何被使用。 - 填寫一張卡片:在此程式庫中的角色、原因(evidence/inferred)、2–4 個替代方案(各帶一個取捨),以及「如果……就會切換」。
- 目錄條目為你提供了起點,但要根據此程式庫進行調整。如果重要的套件在目錄中缺失,仍然要為其建立卡片——使用你自己的知識並說明這一點。
還要為框架本身撰寫一個堆疊層級的比較(例如 Next.js vs Remix vs Vite+React vs Nuxt)——面試官幾乎總是會問這個問題。
步驟 4 — 概念
對於每個有命中的概念(以及你注意到正規表達式遺漏的任何重要概念),開啟命中點,然後解釋:用 2–3 句話說明它是什麼、為什麼在這個確切位置需要它,以及一個陷阱。範例:搜尋輸入框上的去抖 —— 避免每次按鍵都發送 API 請求;陷阱:如果去抖函數在每次渲染時都被重新建立,會導致閉包過時(將其包裹在 useMemo/useCallback 中)。
步驟 5 — 流程
追蹤 1–3 個關鍵使用者旅程的端到端流程(例如「使用者登入」、「使用者搜尋產品」、「表單提交 → 資料庫」)。每個步驟都要指出它發生在哪個檔案中。
步驟 6 — 面試問題
撰寫 10–20 個面試官可能會問關於此專案的問題,並給出基於此程式庫的答案:架構、具體選擇、取捨、擴展性、效能、安全性、測試、「你會改變什麼」。至少包含三個「為什麼選擇 X 而非 Y」的問題。
步驟 7 — 撰寫並渲染
將所有內容按照 references/report-schema.md 的規範寫入 <repo>/.repo-why/report.json,然後:
node <skill>/scripts/render.mjs <repo>/.repo-why/report.json # → report.html
node <skill>/scripts/to-drawio.mjs <repo>/.repo-why/report.json # → architecture.drawio
report.html 是一個自包含的頁面(概觀圖表、帶有類別篩選器的決策卡片、概念、流程、帶有隱藏答案的面試練習)。
architecture.drawio 可在 diagrams.net / draw.io VS Code 擴充功能中開啟,包含一頁架構圖和一頁每個流程的圖。
以一段簡短的聊天摘要結束:一行總結堆疊、3–5 個最具面試價值的決策,以及所產生檔案的路徑。如果使用者不希望將 .repo-why/ 納入版本控制,建議將其加入 .gitignore。
範圍控制
- 大型程式庫或 monorepo:詢問要專注於哪個應用程式/套件,或者先處理最核心的那個,然後列出其餘的。
- 使用者只問一件事(「為什麼這裡用 zustand?」):跳過完整報告;用相同的證據 + 替代方案 + 面試回答風格來回答該問題。