* chore(wiki): 導入 system-dev-template + 合併 wiki 到新位置 - system-dev/ 模板包進版控(VERSION/docs/scripts/wiki 骨架) - 逐檔合併舊 .claude/wiki/ → system-dev/wiki/: - status/mistakes/decisions-summary 真資料覆蓋空範本 - INDEX 新「多角度視圖」結構 + 舊決策/導航併入(過時詞「萬物皆 Block」改 API-as-Wall) - principles/TAXONOMY 為新位置獨有,保留 - 刪舊 .claude/wiki/(git 識別為 rename,內容完整搬移) - 三層機敏防護 hooks + wiki 命令更新 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(sdd): 立 ingest-contract SDD + 搬入 ingest-candidate 契約 (T3.1+T3.8) 對應 issue #1(頂層 mira-dissolve T3)。 - contracts/ingest-candidate.json:ingest→graph 邊界契約(自頂層搬入) - contracts/README.md:標明候選(輸入)≠已存(triplet) - docs/3-specs/ingest-contract/design.md + tasks.md: - ensureTemplate 改 slot-diff 補丁(取代 early-return,免遷移腳本) - 補 KbdbClient.updateRecord(base PATCH /records/:id) - ingest 流程:驗證(422)→idempotency(uri+hash)→先 append 後 deprecate - triplet template 增 source_uri+content_hash slot 承載 idempotency - 跨 repo 協調點(3.6 圖工具併 KBDB MCP)明列需 arcrun 配合 總管已認可四個設計決定(issue #1 comment)。鐵律:零建表/零 SQL/零 migration。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(ingest): POST /triplets/ingest 寫入端 + deprecate-then-append (T3.2-3.5) 對應 issue #1 T3 B 段。 - templates: TRIPLET_SLOTS 加 status/superseded_by/source_uri/content_hash; ENTITY_SLOTS 加 gloss;recordToTriplet 映射新欄位(缺省 status=active 相容舊資料) - kbdb-client: ensureTemplate 改 slot-diff 補丁(既有 template 走 PATCH /templates/:id 補缺 slot,取代 early-return → 免遷移腳本);新增 updateRecord(PATCH /records/:id) - triplet-ingest action(88 行純函式):Zod strict 鏡射 ingest-candidate 契約 → idempotency(uri+hash 同→no-op)→ 先 append 後 deprecate(無「全無 active」空窗) - POST /triplets/ingest route:strict 驗證失敗 → 422(禁送 graph 領域欄位) - queryTriplets 預設 active-only(traverse/search/neighbors 皆經此), includeDeprecated opt-out 供 rollback/考古 - 6 測試案全綠(vitest 16 passed);mock-client 同步 slot-diff + updateRecord gates: zero SQL / zero migration / 無 D1·Vectorize·AI 綁定 / dry-run bundle 乾淨 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(graph): get_source + refresh 端點 + keyword 收斂 (T3.6-3.7) 對應 issue #1 T3 C 段(圖工具 HTTP API 備好,MCP 註冊薄殼待 arcrun)。 - get_source (3.7): graph-source.ts + GET /graph/source/:name — 回節點的 active triplet 來源指標(uri/anchor/block_id/content_hash),去重。 連帶加 source_anchor slot,ingest 從 source.anchor 帶入 - refresh (3.6/3.6b): graph-refresh.ts + POST /graph/refresh — 純被動代轉 ingest(KBDB_INGEST_URL),只人發起、無排程/webhook(fan-out 紅線)。 未設 URL → 誠實 forwarded:false,不假綠 - 3.6d: POST /search 移除公開 keyword 模式(重複 KBDB MCP),收斂 suggest-only; keywordSearch helper 留作 suggest 內部建構塊 - 3 新測試(get_source uri+anchor / active-only / refresh 未就緒誠實回報) gates: vitest 19 passed / zero SQL / 無新綁定 / dry-run bundle 乾淨 待接:MCP 註冊薄殼併 arcrun u6u-mcp-server;refresh 端到端待 ingest(T4) 部署 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: richblack <leo21c@gmail.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
14 KiB
/wiki-init — 初始化或接入 LLM Wiki 系統
初始化這個專案的 LLM Wiki 記憶系統。 新專案建立空白結構,已有專案掃描現有文件並改寫成 wiki。
核心概念:wiki 是 AI 改寫過的記憶,不是原文索引
記憶系統的目的,是讓 AI 之後讀得快。但人類寫的原始文件——不管是 vault 的隨手記、開發專案的會議記錄、規格草稿、散落的 .md——天生是亂的:重複、流水帳、半成品、口語。
如果 wiki 只是一份 [[原文檔名]] 指回原文的索引,那每次未來要用都得重新解析那團亂,等於沒省到。wiki 的價值在於「改寫一次,之後每次讀都便宜」。
所以原則對所有專案一致(不分 vault 或一般開發):
人類寫的原文是 SSoT(真理來源,永遠唯讀)。 但實際要長期保存、被 AI 反覆讀的是 AI 改寫整理過的 wiki。 AI 是總編輯——把原文改寫成自包含、概念原子化、互相連結、適於 AI 讀的知識條目。
唯一例外:原文是不可改動的正式文件(簽署過的規格、法規、合約),必須逐字讀原文——這種才在 wiki 裡用指針指回去,並註明「逐字依原文」。除此之外,一律改寫。
raw source 永遠唯讀:所有產出只往 system-dev/wiki/ 寫,絕不改動、搬移、重新命名原文。
執行流程
第一步:偵測專案狀態
檢查以下項目,判斷是新專案還是已有專案:
- 根目錄有沒有
system-dev/wiki/ - 根目錄有沒有
docs/(或 vault 的pages/、journals/、根目錄.md) - 有沒有散落的
.md檔案
同時偵測 raw source 路徑(同 install.sh 邏輯):
- 根目錄有
logseq/→ Logseq vault,raw source =pages/+journals/ - 根目錄有
.obsidian/→ Obsidian vault,raw source = 根目錄所有.md - 都沒有 → 一般專案,raw source =
docs/下所有.md(及散落的.md)
新專案(幾乎空的)→ 直接建立結構,跳到第三步 已有專案(有文件)→ 執行第二步
第二步:已有專案的掃描(已有專案才執行)
- 遞迴找出 raw source 裡所有
.md檔案 - 先套用
system-dev/wiki/.wikiignore:命中 pattern 的檔案整個排除,不讀不編入。- 若
.wikiignore不存在,從範本建立一份(預設排除.env/*.pem/*secret*等) - 被排除的檔案在清單裡標「🚫 .wikiignore 排除」,不可被覆蓋
- 若
- 對其餘檔案標注改寫計畫:會萃取成哪些 wiki 條目。一份原文可能拆成多個概念原子條目,多份相關原文也可能合併成一條。
- 列出清單給使用者確認,停下來等確認
量大時建議用 Haiku 改寫:逐份原文「改寫成 wiki 格式」是重複、機械、判斷成本低的工作——正適合 Haiku。原文數量多(如數十、上百份)時,主動建議: 「共 N 份原文要改寫,這類逐份萃取很適合用 Haiku 並行處理(便宜、夠快)。要我派 Haiku subagent 改寫嗎?」 得同意後,用 Task / subagent 把每份原文(或每批)丟給 Haiku 改寫,主模型只負責切分概念、定條目邊界、最後審稿與互連。
機敏防護(三層):
- L1 .wikiignore:整檔排除(這一步)
- L2 行內標記:檔案要編入但某段不要 → 遇到
<!-- wiki:ignore -->…<!-- wiki:end -->之間的內容略過,只留「(此處機敏,已略過)」- L3 hook:萬一機敏值仍被寫進 wiki,
wiki-secret-scan.sh會 exit 2 擋下 編入任何檔案前,先檢查是否含密碼/金鑰/個資——有就改記「位置」而非「值」。
第三步:建立缺少的結構
只建立不存在的目錄和檔案,已有的一律不動。
wiki 採三層 + 標籤橫切架構(183 卡實證,issue #8):
system-dev/wiki/
├── INDEX.md ← 索引:多角度視圖的家(標籤角度、決策角度、…)
├── TAXONOMY.md ← 標籤字典(cards 的分類元資料,受控擴充)
├── status.md ← [push] 時態狀態:當前進度、下一步
├── mistakes.md ← [push] 踩過的坑、被糾正的誤解(防不自覺盲區)
├── principles.md ← [push] 跨全局的設計原則(行動前必服從)
└── cards/ ← [pull] 一切知識內容:原文摘要、AI 筆記、決策、概念…
└── <bucket>/ ← 儲存桶(分類由 frontmatter 標籤承載)
├── 00-INDEX.md ← 桶子索引(固定名,容器:只連不重寫,H2/H3 分節)
└── <概念全名>.md ← 概念原子卡(一概念一檔,自包含)
[push] / [pull] 是這套 wiki 的核心判準——因為 wiki 主要是給 AI(CC)看的。 見下方「核心判準:push vs pull」。
decisions-summary.md已降級為 cards + INDEX 決策視圖(決策是知識內容=card);既有的 decisions-summary 若存在,保留為相容,不刪。
關鍵原則:資料夾只是儲存桶,分類由 frontmatter 標籤承載。資料夾名不該硬繼承原稿目錄——原稿目錄是「人為了整理草稿」分的,wiki 連分類都該由 AI 重新組織。
桶子索引固定叫
00-INDEX.md(issue #6):00-前綴讓它排序最前、一眼可辨(像 README 之於資料夾),AI 載入任何cards/<bucket>/一律先讀它,不必猜。檔內 H1 仍寫主題名(如# PKM 知識管理),語意不丟。
一般專案仍可同時建 system-dev/docs/ 分類樹(SDD 等):
system-dev/docs/{1-vision,2-architecture/decisions,3-specs,4-guides,5-records/{incidents,test-reports},6-user}
(純 PKM vault 不需要 system-dev/docs/ 分類樹時,只建 system-dev/wiki/。)
檔案(不存在才建):
system-dev/wiki/INDEX.md、TAXONOMY.mdsystem-dev/wiki/status.md、mistakes.md、principles.md(三個 push 檔)system-dev/docs/README.md(一般專案才需要)
核心判準:push vs pull(wiki 是給 AI 看的)
整理任何內容前,先判斷它該 push 還 pull——判準是「CC 做事時會不會被動看見」:
- push:CC 行動前必須主動出現在 context(session 開始就由 hook 注入)。給「CC 不會主動去查、但不看就出事」的東西。
- pull:CC 想到要查、或載入相關卡時才看見。給「CC 面對它時自然會查」的知識。
為什麼這是核心:mistakes 防的是 CC「不自覺的盲區」——一個你不知道存在的錯,你不會主動去檢索它。靠 CC 自覺去查自己沒自覺的盲區是自相矛盾的,所以 pull 對盲區失效,必須 push。原則同理:沒被推到眼前的準繩,CC 設計時很可能沒想到要服從就做了。
| 內容 | push/pull | 注入形態(hook) |
|---|---|---|
| status | push | 全文——CC 必須知道精確的下一步,摘要會漏 task 編號 |
| principles | push | 全文(一行一條)——短而硬的約束,漏一條就違反;≤15 條,超過代表該下放成 card |
| mistakes | push | 標題清單 + 一行症狀,全文按需 pull——量可能大,摘要足以觸發「我正撞到某條」的認出 |
| decisions、原文摘要、概念知識、一切其餘 | pull | 寫成 cards;CC 面對時自然會查,INDEX 提供角度入口 |
principles 維護規則:一行一條精煉準繩(如「不污染用戶根目錄」「目標用戶 low-code」「wiki 主要給 AI 看」)。發現新的跨全局原則 → append 一行;超過 ~15 條代表某些該合併或下放成 card。累積原則只改 principles.md,不必問用戶開新檔。
第四步:訪談(每次一個問題)
依序問:
- 這個專案做什麼?(一句話)
- 有哪些絕對不能違反的限制?(技術棧、架構原則等)
- 現在進行到哪個階段?
- 有沒有 CC 曾經犯過的錯要先記下來?
把答案填進 CLAUDE.md(如果存在)或建立新的。
第五步:改寫成 wiki(AI 當總編輯)
(第二步確認後執行)
不搬動原文。逐份讀 raw source,改寫萃取成 cards/<bucket>/ 裡的自包含原子卡:
- 概念原子化:一張卡講一個概念,不是一篇原文對一張卡。原文太雜就拆,多份相關原文就合。
- 自包含:讀卡就懂,不必回去翻原文。把口語、重複、流水帳改寫成結構化知識,不寫「詳見原文」。
- 保留來源指針:每卡標
**來源**:原文相對路徑,為可追溯,不是要使用者回去讀。 - frontmatter 標籤分類(見下方):分類走 frontmatter
tags:,不靠資料夾、不靠行內#tag。 - 互相連結(typed-edge 三元組):
## 關聯不只列裸[[頁面]],改寫成帶語義的三元組(見下方)。 - 萃 gloss(node 一句說明):frontmatter 放
gloss:—— 這張卡(= 一個 entity / graph node)的一句話定義,供下游語義 normalize(見下方)。
卡片格式(每張卡):
---
tags: [知識管理, AI協作, 方法論]
gloss: 一句話定義這個概念是什麼(給下游語義 normalize 用,選填、deep tier 才產)
---
# 概念全名
← [[<bucket>/00-INDEX]]
**來源**:`[raw source 相對路徑]`
**最後更新**:YYYY-MM-DD
## 摘要
[一句話核心]
## 重點
- [自包含改寫的要點,不依賴原文]
## 關聯
- [[本卡]] >> 謂詞(動詞短語) >> [[他卡]]
- [[原子筆記]] >> 是其最小單元 >> [[卡片盒筆記法]]
麵包屑用帶路徑 wikilink(issue #7):H1 次行放 ← [[<bucket>/00-INDEX]] 指回桶子索引。
桶子索引固定名 00-INDEX 跨桶會撞名,故指 00-INDEX 一律帶路徑([[pkm/00-INDEX]],Logseq 原生支援、下游 ingest 也能對應到具體檔)。普通卡片間連結仍用裸 [[卡名]](卡名唯一,不需路徑)。
frontmatter 標籤分類(issue #8):
- 用 frontmatter
tags:而非行內#tag:卡片內文常大量用#(講筆記法時的#猜想、#book100),分類標籤若也行內#,下游 ingest 無法區分「分類」與「內文範例」會污染 graph。frontmatter 與內文完全分開,零歧義。 - 用標籤而非資料夾分類:資料夾=強制單一歸屬;標籤=多重歸屬。一張卡可同時屬知識管理+AI協作+架構設計,硬塞一個資料夾會在其他檢索角度漏掉。
- 雙軸 taxonomy(寫進
TAXONOMY.md當字典;受控擴充,非凍結):- 領域(主軸,1-3 個):如 知識管理/學習認知/AI協作/生產力/系統設計/工具教學
- 形態(副軸,0-2 個):方法論/工具實作/觀點主張/架構設計/案例經驗
- 一般開發專案的軸可不同(如 子系統/層級/決策類型),由 AI 依專案性質提出、寫進 TAXONOMY.md。
- 遇到現有軸裝不下的內容:先查是否只是現有標籤的同義詞;確實是新軸才加進 TAXONOMY.md(附定義)再用——禁止繞過字典在卡片直接冒新標籤。字典是 per-repo,跨 repo 不必共用。
typed-edge 規則(issue #5,把「關係」也預編譯,下游 ingest 直接 parse 出帶類型的有向邊):
- 方向性:
A >> 謂詞 >> B必須讀成「A(謂詞)B」一句通順的話;A、B 順序就是主→賓真實方向。 - 謂詞用動詞 / 動詞短語(反駁、奠基於、是…的實作),動詞天然帶方向。
- 謂詞自由書寫,不受控詞彙:下游對謂詞 embedding 時同義謂詞會自動聚類;但方向仍靠書寫順序保證。
- 向後相容:純
[[A]]仍合法(視為無類型邊),盡量補謂詞。
>>是分隔語法,repo 可自選符號,但全程一致。
萃 gloss 規則(issue #9,把「node 的一句說明」也預編譯,供下游 KBDB 語義 normalize):
- gloss = 這個 entity / graph node 是什麼的一句話。下游對「entity 名 + gloss」一起做 embedding 求相似度,自動歸一同義詞(比只對名字準、比手維護 alias 表自動)。
- 在知識生產的當下、由 local CC 建:gloss 跟三元組同階段萃,不留給下游 ingest 臨時補——下游只有單檔 / 跨庫視角,編不出貼合的 gloss(=胡扯)。local scope 才有完整脈絡寫對。
- 選填、deep tier 才產:淺萃(只要結構)時不浪費;deep 改寫時每張卡補一句
gloss:。 - gloss ≠ 摘要:
gloss是 frontmatter 裡給機器 normalize 用的定義句(「X 是…」),求精準可 embedding;## 摘要是給人讀的核心一句。可相近但分屬兩處、兩用途。 - 格式對齊下游 envelope:frontmatter
gloss:對應下游 ingest envelope 的nodes[].gloss欄位,ingest 直接取用、不再回頭補。
INDEX.md 是標籤視圖(非資料夾列表),00-INDEX.md 是桶內容器(只連不重寫,H2/H3 分節)。
頂層索引指桶子索引帶路徑:[[pkm/00-INDEX]]。
與 claude.ai Cowork 的
system-dev/docs/SKILL.md改寫邏輯一致,兩條路徑(CC / Cowork)產出同一種 wiki。
第六步:完成報告 + 驗證
完成後驗證原文 0 動(踩過的坑,issue #8):
git status --short pages/ journals/ # 或一般專案的 docs/ ——須 0 新增 0 修改
改寫時必守(subagent 尤其):
- 絕不寫入 raw source:subagent 目標一律給絕對路徑到
cards/<bucket>/,明寫「絕不寫入 pages/journals/docs 原稿」;事後用上面的git status驗。- 檔名 = 卡片全名,否則
[[全名]]對不到檔。冒號用全形「:」、斜線用全形「/」,全程一種字元,避免/、∕、:混用斷鏈。- 量大用 Haiku 並行改寫,主模型只切概念邊界+審稿+修跨資料夾斷鏈。
告知:
✅ wiki-init 完成
建立了:[列出新建的目錄和檔案]
跳過了:[列出已有因此不動的]
改寫了:[N 份原文 → M 張原子卡、K 條 typed-edge、M 條 gloss(deep tier)]
原文驗證:pages/ journals/ git status 0 異動 ✅
下一步:用 /wiki-capture 把重要決策存進 wiki