Files
system-dev-template/README.md
T
Leo d10659bd2d feat: install.sh 偵測 vault 類型寫入 raw source + Cowork 整理 skill
- install.sh:建立 CLAUDE.md 前偵測資料夾類型,寫入對應 raw source
  - logseq/ → pages/, journals/
  - .obsidian/ → 根目錄 .md
  - 都沒有 → docs/(維持原行為)
  宣告區塊對 vault 明令不得搬動/改名 .md,整理只寫進 .claude/wiki/。
  已有 CLAUDE.md 一律不覆蓋,改列提醒手動補。
- docs/SKILL.md:給 claude.ai Cowork 的 wiki-cowork-scan skill,
  與 CC 共用同一套偵測與整理規則。
- README:新增 vault 支援、Cowork 整理兩節,更新目錄樹。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 20:01:21 +08:00

235 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# system-dev-template
> 讓 Claude Code 從「猛衝的工程師」變成「有紀律的工程師」。
CC 是個優秀的工程師,但不是個好的專案經理。它會猛衝完成工作——小專案很好,大專案就會:
- **改這個壞那個**:沒有全局觀,缺乏 SDD 約束
- **文件越來越亂**:內建記憶不可靠,知識隨對話消失,而且它很喜歡寫文件,寫完也不去讀,還到處亂擺
這個模板用兩套系統解決這兩個問題:
| 系統 | 解決什麼 | 核心機制 |
|------|---------|---------|
| **SDD 系統** | 全局觀、先想再做 | 動手前必須有 design.md + tasks.md |
| **LLM Wiki** | 記憶累積、文件有序 | 雙空間:原始文件(人寫)+ .claude/wiki/AI 整理)|
> **不只程式碼專案、不只 Claude Code。** LLM Wiki 現在也認得 **Logseq / Obsidian vault**——
> 安裝時自動偵測你在哪種資料夾,把對應的「原始文件來源」寫進 `CLAUDE.md`,整理 wiki 時只讀那裡、
> 絕不搬動 vault 結構(見下方「不只程式碼,也認得 Logseq / Obsidian vault」)。
> 整理者也不限 Claude Code——**claude.ai 的 Cowork** 可以用同一套規則掃描、整理你本機的所有 wiki
> (見下方「Cowork 也能整理 wiki」)。
- SDD:它已經很流行了,做的最徹底應該是 Amazon Kiro,但台灣無法付費,用這個方式比什麼酷炫方式更好,逼 CC 不隨心所欲。
- LLM Wiki:是大神 Karpathy 提出的最新的 RAG 想法,這是 Pre-compile 做法,比你公司買的用嵌入模型切割文件成向量的方式更優更不瑣碎,而且執行容易。
---
## 兩種使用方式
### 方式一:新專案
```bash
git clone https://github.com/uncle6me-web/system-dev-template
cp -r system-dev-template/template/. your-new-project/
cd your-new-project
```
然後在 CC 對話裡:
```
/wiki-init
```
### 方式二:已有專案(接入)
```bash
cd your-existing-project
curl -sSL https://raw.githubusercontent.com/uncle6me-web/system-dev-template/main/scripts/install.sh | bash
```
腳本只建立缺少的東西,**已有的檔案一律不動**。
**只要一塊?** 兩套系統可分開裝(有時只需要 wiki,不需要 SDD):
```bash
# 下載後帶參數執行
curl -sSL .../install.sh -o install.sh && bash install.sh --wiki # 只裝 LLM Wiki
bash install.sh --sdd # 只裝 SDD
bash install.sh --all # 兩個都裝(預設)
```
在終端機直接跑(有 tty)時,不帶參數會**互動詢問**要裝哪一塊——對非工程背景的使用者最友善。`curl | bash` 無 tty 則安全預設為 `--all`。settings.json 的 hooks 會依選的模組自動組裝。
安裝完後在 CC 對話裡:
```
/wiki-init
```
CC 會掃描現有文件、建立 wiki、整理 docs 結構。
> CC 很喜歡寫文件到處亂擺,隨着專案越大、越久,檔案夾會很亂,但又不敢亂搬,現在把檔案夾如規範寫好,可以一次幫你把文件歸檔。
> LLM Wiki 不會動你的原檔案,但它會另外建立 Wiki,修正你的入口就是 CLAUDE.md,所以它雖然搬動,你的文件不會消失。
---
## 🔄 已安裝舊版?一鍵更新
聽到出新功能了,想升級到最新版,跑這一行就好:
```bash
cd your-project
curl -sSL https://raw.githubusercontent.com/uncle6me-web/system-dev-template/main/scripts/update.sh | bash
```
它會先比對你的版本和最新版,告訴你**多了哪些新功能**,然後:
| 動作 | 對象 |
|------|------|
| 🆕 **補上**新功能(舊版沒有的 hook / command / 範本) | 模板檔 |
| ⬆️ **更新**模板邏輯(hooks、commands、TEMPLATE-* 換成新版) | 模板檔 |
| 🔒 **完全不碰**你的內容與設定 | `wiki/status.md``mistakes.md``decisions-summary.md``.wikiignore``settings.json``CLAUDE.md` |
> **為什麼第一次要用 curl?** 舊版本機還沒有 `update.sh`,所以第一次得從遠端抓它下來跑。
> 跑完它會把自己也裝進 `scripts/update.sh`**之後更新直接跑** `bash scripts/update.sh` 就好,不用再 curl。
更新只會動「已安裝的模組」(裝了 wiki 就更新 wiki,裝了 SDD 就更新 SDD),偵測自動完成。
`settings.json` 缺了新版才有的 hook,它不會幫你改設定,但會在結尾**列出來提醒你手動補**(不擅自動你的設定)。
📜 想知道每次改了什麼、現在是哪一版?看 **[更新紀錄 CHANGELOG](CHANGELOG.md)**。
---
## 不只程式碼,也認得 Logseq / Obsidian vault
LLM Wiki 原本假設「原始文件放在 `docs/`」,但 Logseq、Obsidian 這類筆記 vault 有自己的目錄慣例。
現在 `install.sh` 會在建立 `CLAUDE.md` 之前**自動偵測資料夾類型**,把對應的「原始文件來源(raw source)」寫進 `CLAUDE.md`
| 偵測到 | vault 類型 | raw source(原始文件來源)|
|--------|-----------|---------------------------|
| `logseq/` 資料夾 | Logseq | `pages/``journals/` |
| `.obsidian/` 資料夾 | Obsidian | 根目錄下所有 `.md` |
| 都沒有 | 一般專案 | `docs/`(維持原行為)|
寫進 `CLAUDE.md` 的這段宣告是**給 AI 讀的指令**——它告訴整理者「原始文件在哪、整理 wiki 時只讀那裡」,
而且對 vault **明令不得搬動、改名、重新分類 `.md`**,整理結果一律只寫進 `.claude/wiki/`
這樣面對筆記 vault 也不會破壞它原本的結構,筆記不會變得不可讀。
> **已有 `CLAUDE.md`?** 一律不覆蓋(維持「已有的不動」原則),改在安裝結尾**列出該補的宣告**提醒你手動貼。
---
## Cowork 也能整理 wiki
整理 wiki 的人不再只有終端機裡的 Claude Code——**claude.ai 的 Cowork** 也可以。
`docs/SKILL.md` 提供一個給 Cowork 用的 skill`wiki-cowork-scan`),它與 CC 的 `/wiki-init``/wiki-capture`
**共用同一套規則**
- 掃描 `~/Documents` 下所有裝了 system-dev-template(含 `.claude/wiki/`)的資料夾
- 用**和 `install.sh` 一致的偵測邏輯**判斷每個資料夾是一般專案 / Logseq / Obsidian
- 只讀 raw source、只往 `.claude/wiki/` 增補(不覆蓋、不刪除),**絕不動** raw source、`CLAUDE.md``logseq/``.obsidian/``assets/`
**CC 與 Cowork 輸出格式相同**,任一方整理過的內容,另一方看到就跳過或補充,不重複也不覆蓋。
適合掛在 Cowork 的定期排程,讓本機所有 wiki 自動保持更新。
> 想用:把 `docs/SKILL.md` 提供給你的 Cowork 當 skill 參考,再對它說「整理 wiki」即可。
---
## 目錄說明
```
system-dev-template/
├── template/ ← 複製到新專案的骨架
│ ├── CLAUDE.md ← 填空版導航牌
│ ├── docs/ ← 文件結構(六層分類)
│ └── .claude/
│ ├── wiki/ ← CC 的記憶空間(含 .wikiignore 機敏排除)
│ ├── commands/ ← Slash commands
│ ├── hooks/ ← 硬攔截(接關 + SDD 協議 + wiki 機敏掃描)
│ └── settings.json ← 掛 hooksinstall.sh 依模組組裝)
├── skills/
│ └── llm-wiki/ ← 複製到 Legacy-Workspace/.claude/skills/
├── scripts/
│ ├── install.sh ← 已有專案接入腳本
│ └── update.sh ← 舊版一鍵更新(只換模板,不碰你的資料)
└── docs/ ← 這個 repo 自己的說明
├── why.md ← 設計理念
├── wishlist.md ← 待補功能與已完成記錄
└── SKILL.md ← 給 claude.ai Cowork 的 wiki 整理 skillwiki-cowork-scan
```
---
## Slash Commands
安裝後在任何 CC 對話裡可用:
| Command | 做什麼 |
|---------|-------|
| `/wiki-init` | 初始化 wiki(新專案或接入已有專案)|
| `/wiki-recall` | Session 開始,手動接關(hook 沒啟動時的 fallback|
| `/wiki-capture` | 把這次對話的結論存進 wiki |
| `/wiki-update` | Session 結束,更新 status.md |
| `/sdd-check` | 確認當前任務有沒有對應 SDD |
| `/issue-handle` | 處理 GitHub issue(讀回自己 repo / 跨 repo 發要先問 / 禁自動輪詢)|
命名閉環:init(建) → update(存,session 末) ↔ recall(接,session 初) → capture(隨時存結論)。
---
## Hooks(軟規範 → 硬攔截)
規範不再只是 CLAUDE.md 的軟提醒,加了底線機制:
| Hook | 角色 |
|------|------|
| `session-start-recall.sh` | 開 session 自動注入 status 重點,不靠 CC 自覺 |
| `sdd-guard.sh` | 動 code 檔但沒有任何 SDD → 攔(exit 2),對應 `/sdd-check` 的自動版 |
| `wiki-secret-scan.sh` | 機敏值要寫進 `.claude/wiki/` → 攔(exit 2),密碼/金鑰/個資的機械底線 |
| `pre-write-guard.sh` | 專案自訂禁令範本骨架(預設停用,填 pattern 才生效)|
---
## Wiki 機敏防護(不想被編入的內容)
`.gitignore` 一樣,讓不想進 wiki 的內容(密碼、金鑰、個資)不被編入。三層:
| 層 | 機制 | 擋什麼 | 性質 |
|----|------|--------|------|
| **L1** | `.claude/wiki/.wikiignore`(glob) | 整個機敏檔不編入 | 協議(CC 遵守)|
| **L2** | 行內標記 `<!-- wiki:ignore -->``<!-- wiki:end -->` | 檔案內某段不編入 | 協議(CC 遵守)|
| **L3** | `wiki-secret-scan.sh` hook | 機敏值真的寫進 wiki → exit 2 擋 | **硬攔截(機械偵測)**|
L1/L2 是你主動標記,L3 是自動兜底——萬一 CC 漏掉前兩層,寫進 wiki 的那一刻會被 regex 攔下(密碼賦值、PEM 私鑰、AWS/GitHub/Slack 金鑰、JWT、連線字串帳密、身分證、信用卡號)。
> 誠實限制:L1/L2 靠 CC 自律,L3 靠特徵比對(有偽陽/偽陰)。
> 這是「減少**意外**外洩」的機制,不是保險箱——真正的密鑰本就不該進版控。
> 誤判時:該行尾加 `wiki-secret-ok` 放行;整檔機敏則加進 `.wikiignore`。
> 誠實限制:hook 擋語法層明顯違規(直接寫檔),擋不了藏在 helper / bash 裡的繞道。
> 價值是「想跳過會被抓到 + 留痕可審」,不是技術防偽——文檔(mindset)+ hook(底線)都不可省。
---
## 設計原則
- **疊加,不覆蓋**:接入已有專案時,現有規範保留,wiki 系統疊上去
- **結構即協議**:CC 和你共用同一個分類系統,不需要每次解釋
- **CLAUDE.md 不增長**:超過 100 行就是架構出問題,不是加更多內容
- **對話結論當場 capture**:討論完用 `/wiki-capture`,知識不再消失
---
## 致謝
這個模板站在巨人的肩膀上:
- **[Andrej Karpathy](https://gist.github.com/karpathy)** — LLM Wiki 概念的提出者。本模板的雙空間記憶系統直接源自他 2026 年 4 月的構想:用 LLM 把知識「pre-compile」成互相連結的 markdown,而非每次查詢都重跑 embedding 檢索。他的一句話道盡精神:*"Obsidian is the IDE, the LLM is the programmer, the wiki is the codebase."*
- 概念延伸閱讀:[The Andrej Karpathy LLM Wiki Idea](https://reliabilitywhisperer.substack.com/p/the-andrej-karpathy-llm-wiki-idea)、[Beyond RAG (Level Up Coding)](https://levelup.gitconnected.com/beyond-rag-how-andrej-karpathys-llm-wiki-pattern-builds-knowledge-that-actually-compounds-31a08528665e)
- **[Amazon Kiro](https://aws.amazon.com/documentation-overview/kiro/)** — 本模板的 SDDSpec-Driven Development)做法學自 Kiro。它把「動手前先有結構化規格」這件事做到最徹底;台灣雖然付費不便,但它的方法論值得致敬與借鑑。
- **ClaudeClaude Code / Anthropic** — 本模板的 hooks、機敏防護、模組化安裝與這份說明,都是與 Claude 結對開發完成的。模板本身就是為了讓 Claude Code「從猛衝的工程師變成有紀律的工程師」——它既是工具,也是共同作者。