← ClaudeAtlas

setup-ts-deep-moduleslisted

將 dependency-cruiser 接入 TypeScript repo,讓每個套件都是深模組 — 實作藏在子資料夾中,只能透過其進入點檔案觸達。使用者觸發。
shumingyang-opencode/mattpocock-skills-zh-tw · ★ 2 · AI & Automation · score 78
Install: claude install-skill shumingyang-opencode/mattpocock-skills-zh-tw
# 設定 TS 深模組(Setup TS Deep Modules) 讓此 repo 中的每個套件都是**深模組**:小介面後面的大量行為。套件的公開表面是它的**進入點** — 套件根目錄中的檔案 — 而其子資料夾中的一切都被隱藏。此技能安裝 [dependency-cruiser](https://github.com/sverweij/dependency-cruiser) 以及讓進入點成為唯一入口的規則,然後證明規則確實咬人。 對於詞彙(深模組、介面、接縫、深度),執行 `/codebase-design` 技能 — 全程使用它的語言。 ## 這強制出來的形狀 ``` src/packages/ <name>/ index.ts ← 一個進入點(公開)。從外部匯入這個。 client.ts ← 另一個進入點。套件可以暴露多個(SEVERAL)。 lib/ ← 實作:對外隱藏,彼此之間可以自由匯入。 tests/ ← 共置的測試 + 固定裝置(一個子資料夾,所以是私有的)。 ``` 公開表面是套件的**根目錄檔案** — 不是一個指定的 `index.ts`。依照慣例,實作住在 `lib/`、測試住在 `tests/`,給每個套件相同的兩資料夾形狀。但規則本身是通用的:*任何*子資料夾中的*任何東西*都是私有的,所以您永遠不需要擴充設定來新增資料夾。 四個規則,全部是 `error`: 1. **進入點邊界** — 套件外的程式碼(app 程式碼或另一個套件)只能匯入該套件的進入點(其根目錄檔案),絕不能匯入其子資料夾中的任何東西。 2. **套件內自由** — 套件自己的檔案彼此自由匯入。 3. **測試透過進入點** — `<pkg>/tests/` 下的檔案可以匯入任何套件的進入點與它們自己的 `tests/` 固定裝置,但絕不能匯入任何套件的子資料夾內部(即使自己的也不行)。跨套件的整合測試可以;深層匯入不行。 4. **無循環** — 沒有依賴循環。 **進入點,不是 barrel。** 因為公開表面是*每個*根目錄檔案,一個套件可以暴露幾個小的進入點(`index.ts`、`client.ts`、`server.ts`),而不是把一切漏斗進一個巨大的 `index.ts`。重新匯出整個子樹的 barrel 檔案是不被鼓勵的 — 保持進入點小而把實作藏在子資料夾中。 分層(哪個套件可以依賴哪個)是*另一個*關注點,在設定中留為一個註解掉的樁,供此 repo 填寫。 ## 步驟 ### 1. 偵測環境 - **套件管理員** — `pnpm-lock.yaml` → pnpm、`yarn.lock` → yarn、`bun.lockb` → bun,否則 npm。用它執行下面每個命令(`pnpm`/`yarn`/`npm run`/`bunx`)。 - **套件根目錄** — 如果 `src/` 存在就用 `src/packages`,否則用 `packages`。如果 repo 已經有一個不同的明顯慣例,與使用者確認選擇。 - **既有設定** — 檢查是否有 `.dependency-cruiser.*` 檔案。如果存在,**不要**覆寫它:把四個規則與選項合併進去,並告訴使用者您新增了什麼。 **完成於:** 套件管理員、套件根目錄與既有設定狀態都已得知。 ### 2. 安裝 dependency-