Files
system-dev-template/CHANGELOG.md
T
Leo e9d6d78032 fix: install/update 雙語化(預設英文) + 修 macOS bash 3.2 安裝崩潰 + bump 1.7.0
- 修崩潰:bash 3.2 + set -u 展開空陣列會炸 unbound variable;移除多餘
  ${SKIPPED[*]} no-op;多位元組字串旁變數改用 ${VAR} 防 curl|bash 串流切斷
- install/update 訊息依 locale 雙語,預設英文(curl|bash 常 LANG=C),zh_TW 切繁中
- 寫進 CLAUDE.md 的 raw source 宣告依 locale 只寫一種語言(不撐爆 context)
- 修措辭:一般開發案不再顯示誤導的「偵測到 vault 類型:docs」
- 新增 README.en.md(繁中↔English 切換)
- gitignore dogfooding 自裝產物(CLAUDE.md/docs 子目錄/.claude/settings*)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 12:40:28 +08:00

169 lines
13 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.
# 更新紀錄 CHANGELOG
> 每次改了什麼,都記在這。版號對應 `template/.claude/VERSION`。
> 想更新到最新版?看 [README → 一鍵更新](README.md#-已安裝舊版一鍵更新)。
版號規則(語意化版本,簡化版):
- **大版號**(1.x → 2.x):破壞性變動,舊專案更新後可能要手動調整。
- **中版號**(1.0 → 1.1):加了新功能,向下相容,更新即用。
- **小版號**1.1.0 → 1.1.1):修 bug、改文件,無新功能。
---
## 1.7.0 — install/update 雙語化 + 修 macOS bash 3.2 安裝崩潰
非台灣使用者看不懂中文安裝訊息(`curl | bash` 出來整片中文),加上 macOS 內建 bash 3.2 在 `set -u` 下會崩。這版一起修:
- **修崩潰**`install.sh` 在 macOS bash 3.2 下會噴 `VAULT_TYPE…: unbound variable` / `SKIPPED[*]: unbound variable`。根因是 bash 3.2 + `set -u` 展開「空陣列」會炸,加上一行多餘的 `${SKIPPED[*]}` no-op。修法:空陣列展開前先檢查、移除廢行、多位元組字串旁的變數一律用 `${VAR}` 包好(避免 `curl | bash` 串流在多位元組字元邊界被切斷而誤判變數名)。
- **install/update 訊息雙語**:依 locale 自動選語言,**預設英文**(`curl | bash` 常是 `LANG=C`,外國人預設就看得懂),`zh_TW` 自動切回繁中。
- **寫進 CLAUDE.md 的 raw source 宣告也雙語**:依 locale **只寫一種語言**進 CLAUDE.md(雙語會讓每個 session 的 context 更滿)。
- **修措辭**:一般開發案不再顯示誤導的「偵測到 vault 類型:docs」。偵測到 logseq/obsidian 筆記庫 → 出聲「會保留你的筆記結構」;不是筆記 → 默默裝完。
- **README 多語**:新增 `README.en.md`,頂部繁中 ↔ English 切換連結,利於被搜尋到。
## 1.6.1 — 釐清 taxonomy 是「受控擴充」非「凍結」
1.6.0 把標籤字典寫成「禁止自創」,措辭過嚴:碰到現有軸裝不下的新內容時,會逼 AI 硬塞錯標籤或偷偷自創,兩者都比受控擴充差。改成正確的機制:
- **禁止的是「繞過字典在卡片直接冒新標籤」,不是「新增標籤」**。字典**可擴充**。
- 流程:遇到裝不下的內容 → ① 先查既有(是真新軸還是同義詞?`知識管理` vs `KM` 別重造)→ ② 確實是新軸才登記進字典(附定義)再用。不必停下來問人,但「先查重再登記」不能省。
- **字典是 per-repo**:跨 repo 引擎靠各 repo 自己一致的 taxonomy 接合,不是逼所有 repo 共用一份。
- **新增領域軸要慎**(影響全庫聚類),形態軸擴充較安全;不確定就先用最接近的並註記「待人類複核」。
同步 `wiki-init.md``docs/SKILL.md``TAXONOMY.md` 三處措辭。
---
## 1.6.0 — wiki 完整規劃方式(183 卡實證):三層架構 + frontmatter 標籤 + 多層索引(issue #8/#6/#7
在一個中文 Logseq vault234 篇 pages + journals → 183 張原子卡、571 條 typed-edge)完整跑了一輪 LLM Wiki,把「對 AI 最優」的規劃方式定案。一次納入 `wiki-init.md``docs/SKILL.md`CC / Cowork 兩路徑一致):
**新增**
- **三層 + 標籤橫切架構**:頂層 `INDEX.md`(標籤視圖)→ `cards/<bucket>/00-INDEX.md`(桶子索引)→ 概念原子卡。資料夾只是儲存桶,**分類由標籤承載**,不繼承原稿目錄。
- **frontmatter 標籤分類**issue #8):分類走 frontmatter `tags:`,不靠資料夾、不靠行內 `#tag`——內文常用 `#`(如 `#猜想`),行內標籤會讓下游 ingest 分不清「分類」與「內文範例」污染 graph。雙軸 taxonomy(領域 + 形態)寫進新檔 **`TAXONOMY.md`** 當字典,**禁止自創標籤**。
- **桶子索引固定名 `00-INDEX.md`**issue #6):`00-` 排序最前、一眼可辨,AI 載入任何桶一律先讀它。
- **麵包屑帶路徑 wikilink**issue #7):卡片 H1 次行 `← [[<bucket>/00-INDEX]]`。固定名 `00-INDEX` 跨桶撞名,故指它一律帶路徑;卡片間連結仍用裸 `[[卡名]]`
- **新檔 `template/.claude/wiki/TAXONOMY.md`**:標籤字典範本。install.sh `download_if_missing`、update.sh `keep_file`(使用者客製,永不覆蓋)。
**踩坑警語寫進 wiki-init**
- subagent 改寫時會誤把卡寫進 raw source → 目標一律給絕對路徑到 `cards/<bucket>/`,事後 `git status --short pages/ journals/` 驗證原文 0 異動。
- 檔名=卡片全名,冒號用全形「:」、斜線用全形「/」,全程一種字元避免斷鏈。
- 量大用 Haiku 並行改寫,主模型只切概念邊界 + 審稿 + 修斷鏈。
---
## 1.5.0 — wiki 連結升級成 typed-edge 三元組(issue #5
**背景**`## 關聯` 原本只列裸 `[[頁面]]`(沿用 Karpathy LLM Wiki)。但裸 `[[A]]` 是**弱連結**——只說「A 和本卡有關」,沒說關係是什麼。下游要從 wiki 抽 knowledge graph 時,拿到一堆無類型 edges,仍得回讀兩張卡才知道關係,等於關係沒被預編譯、退回 O(N²)。
**變更**
- `wiki-init.md``docs/SKILL.md``## 關聯` 升級成 **typed-edge 三元組**`[[A]] >> 謂詞 >> [[B]]`。下游 ingest 可直接 parse 出帶類型的有向邊,全局 graph 不必再讀卡片內容就知道關係。
- 規則:① 方向性——`A >> 謂詞 >> B` 須讀成「A(謂詞)B」一句通順的話,順序=主→賓真實方向;② 謂詞用動詞/動詞短語(天然帶方向);③ 謂詞自由書寫不受控詞彙(下游 embedding 會聚類同義謂詞,但方向靠書寫順序保證);④ 向後相容:純 `[[A]]` 仍合法(無類型邊)。
- `>>` 為分隔語法,repo 可自選符號,全程一致即可。
---
## 1.4.1 — wiki = AI 改寫的記憶(拿掉索引模式)+ 量大建議 Haiku(issue #4
**修正 1.4.0 的方向**:1.4.0 把「索引 vs 改寫」做成兩種並列模式,預設一般專案走索引、只有 vault 走改寫。這方向錯了——
> **記憶系統的目的是讓 AI 之後讀得快。** 不管 vault 還是一般開發專案,人類原文都是亂的(重複、流水帳、半成品)。若 wiki 只是指回原文的索引,每次未來用都得重新解析那團亂=沒省到。**wiki 的價值就在「改寫一次,之後每次讀都便宜」。**
**變更**
- `wiki-init.md` **拿掉索引模式**,改寫成 wiki 是**所有專案的唯一預設**(vault 與一般開發一致)。原文=唯讀 SSoT,wiki=AI 改寫過的記憶,AI 是總編輯。
- 唯一例外:原文是不可改動的正式文件(簽署規格/法規/合約,須逐字讀)才用指針指回原文並註明「逐字依原文」。
- **量大建議用 Haiku**:逐份原文改寫成 wiki 格式是重複、機械、判斷成本低的工作,正適合 Haiku。原文數量多時,命令會主動建議派 Haiku subagent 並行改寫,主模型只負責切概念、定條目邊界、審稿與互連。
- `INDEX.md` 範本:統一成「概念索引指向 wiki 內部條目」,不再提索引模式。
---
## 1.4.0 — wiki-init 新增「草稿改寫模式」:AI 當總編輯(issue #4)
**背景**:在 Logseq vault234 篇 pages + journals)壓測 `/wiki-init`,發現它整套指令語言只有「分類歸檔/導航」,把人和 AI 都導向做出一個 `[[原文檔名]]` 指回原文的**索引**。但 PKM / vault 使用者的心智模型常是相反的——原文只是**草稿**(轉錄稿、隨手記),要 AI **改寫萃取成自包含 wiki**,之後讀 wiki 就好、不必回原文。template 沒區分這兩種,且預設了「原文是成品」。
**新增**
- `wiki-init.md` 開頭新增**模式分岔(第零步)**:索引模式 vs **草稿改寫模式(AI 當總編輯)**,附對照表講清楚原文角色、INDEX 連結、回答方式的差異。
- **偵測到 PKM vaultLogseq/Obsidian)→ 預設草稿改寫模式**,但明確問一句讓使用者可切回索引模式。
- **一般專案 → 預設索引模式**(維持原行為,向下相容)。
- 草稿改寫模式的產出規則(第五步):概念原子化、自包含、保留來源指針(可追溯但不必回讀)、`[[wikilink]]` 互連——與 claude.ai Cowork 的 `docs/SKILL.md` 改寫邏輯**一致**,CC / Cowork 兩條路徑產出同一種 wiki。
- `INDEX.md` 範本:草稿模式下改成「概念索引」指向 wiki **內部**改寫條目,而非指回原文。
**不變**:raw source 永遠唯讀,兩種模式都只往 `.claude/wiki/` 寫,絕不搬移/改名原文。
---
## 1.3.1 — 修:update.sh 不再覆蓋客製的 pre-write-guard.shissue #3
**修正**
- `scripts/update.sh` 原本把 `pre-write-guard.sh` 列在「覆蓋更新」區,**無條件**用模板空殼蓋掉。
但此檔的定位是「使用者手填的 guardrail 客製檔」(CHANGELOG 1.2.0),下游通常已塞滿自己的 enforcement
`update_file` 覆蓋**無 `.bak` 備份**——跑一次 update 等於無聲關掉整套 guardrail(如 Arcrun 的 KNOWN_SDDS 白名單、薄殼原則強制等數百行)。
- 改法(issue 建議方案 1):新增 `keep_with_template()`,把 `pre-write-guard.sh` 移出覆蓋區。
**原檔永不覆蓋**,改把最新模板版另存成 `pre-write-guard.template.sh` 旁邊,更新結尾印出 `diff` 指令供使用者自行採納。
首次安裝(原檔不存在)才會直接抓本體。`install.sh` 路徑本就用 `download_if_missing`(已存在即跳過),無此問題。
---
## 1.3.0 — vault 偵測(Logseq / Obsidian+ Cowork 整理 skill
**新增**
- `install.sh` 在建立 `CLAUDE.md` 前**自動偵測資料夾類型**,把對應的「原始文件來源(raw source)」寫進 `CLAUDE.md`
- `logseq/` → raw source `pages/``journals/`
- `.obsidian/` → raw source 根目錄下所有 `.md`
- 都沒有 → `docs/`(維持原行為)
寫入的宣告是給 AI 讀的指令,對 vault **明令不得搬動/改名/重新分類 `.md`**,整理結果一律只寫進 `.claude/wiki/`
面對筆記 vault 不會破壞它原本的結構。已有 `CLAUDE.md` 一律不覆蓋,改在結尾列出該補的宣告提醒手動貼。
- `docs/SKILL.md`:給 **claude.ai Cowork**`wiki-cowork-scan` skill。
與 CC 的 `/wiki-init``/wiki-capture` 共用同一套規則,用**與 install.sh 一致的偵測邏輯**掃描
`~/Documents` 下所有裝了本模板的資料夾,只讀 raw source、只往 `.claude/wiki/` 增補(不覆蓋、不刪除),
絕不動 raw source、`CLAUDE.md``logseq/``.obsidian/``assets/`。讓整理 wiki 不再只限終端機裡的 CC。
**變更**
- README 新增「不只程式碼,也認得 Logseq / Obsidian vault」「Cowork 也能整理 wiki」兩節,並更新目錄樹。
---
## 1.2.0 — GitHub issue 指引 + pre-write-guard 定位釐清
**新增**
- `/issue-handle` slash command`template/.claude/commands/issue-handle.md`):
CC 處理 GitHub issue 的普世指引,三層界線——
①讀/回/結案自己 repo 的 issue(直接做);
②發 issue 給別的 repo(先問人,不擅自);
③**禁止掛 Actions/cron/webhook 自動輪詢 issue**(會觸發 GitHub 異常偵測、被 rate limit)。
屬共用指引,install/update 不分模組都裝。(issue #1
**變更**
- `pre-write-guard.sh` 釐清定位(issue #2):它是「按需手填的空插槽」,不是裝上就生效的警察。
- 檔頭明講:**有 CC 在場時,直接叫 CC 寫貼合的 guard hook 更好**,這個空殼範本只對「手動 DIY」用戶有價值。
- 解決安全錯覺:install.sh / update.sh 安裝它時提示「預設不攔任何東西,要手填+掛 settings 才生效」,
讓用戶不會誤以為裝了就有保護。(hook 執行時維持安靜,避免每次 Write 洗版。)
---
## 1.1.0 — 一鍵更新
**新增**
- `scripts/update.sh`:已安裝舊版的人,一行指令更新到最新版。
只覆蓋模板/邏輯檔(hooks、commands、TEMPLATE-*),**完全不碰**使用者資料
`wiki/status.md``mistakes.md``decisions-summary.md``.wikiignore``settings.json``CLAUDE.md`)。
會先比對版本、列出新功能、依已裝模組自動偵測該更新什麼,跑完自我更新。
- `template/.claude/VERSION`:版本基準檔,讓「檢查新版」有依據。
- `CHANGELOG.md`(本檔)。
**第一次更新的雞生蛋問題**:舊版本機還沒有 `update.sh`,所以第一次靠 README 那行
`curl` 從遠端抓更新器來跑;跑完它把自己裝進 `scripts/update.sh`,之後直接跑本機的即可。
---
## 1.0.0 — 模組化安裝(基準版)
此版本之前無 VERSION 檔,以下為依 git 歷史回溯的功能基準。
- `scripts/install.sh` 模組化安裝:`--wiki` / `--sdd` / `--all`,無參數則互動詢問。
- **LLM Wiki**CC 記憶系統(INDEX / status / mistakes / decisions-summary
+ 接關 hooksession-start-recall+ 對應 slash commands。
- **wiki 機敏防護三層**`.wikiignore`(檔案層)+行內標記(局部)+
`wiki-secret-scan.sh`(機械兜底攔截)。
- **SDD 強制**:動 code 前必須有 `design.md`,由 `sdd-guard.sh` hook 把關,附 TEMPLATE 範本。
- docs 分類結構(1-vision ~ 6-user)與 ADR 範本。