Compare commits
2 Commits
146d3c4875
...
989a6fbfed
| Author | SHA1 | Date | |
|---|---|---|---|
| 989a6fbfed | |||
| 9a5219d8bd |
@@ -10,6 +10,20 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 1.14.0 — vault 萃取能力:raw Logseq 筆記 → system-dev/wiki(知識一庫 ingest 前段;issue #5)
|
||||||
|
|
||||||
|
筆記 vault(Logseq graph 如 `notes`/`kb`、或 Obsidian)只有原文、需要萃。新增可**重跑、冪等**的 vault 增量萃取,把原始筆記萃成 `system-dev/wiki/` 的精耕卡+`[[wikilink]]`,供下游 Arcrun ingest 從 wikilink 機械拉三元組進 KBDB。**AI 只產卡片檔,不寫 KBDB、不拉三元組**(那是下游的事)。
|
||||||
|
|
||||||
|
- **新增 `/wiki-extract` 命令**(`template/.claude/commands/wiki-extract.md`):vault 專用的增量重萃入口,給 Routine / cloud-worker 反覆跑。跟 `/wiki-init`(一次性首萃)分工——首萃後 vault 持續進新筆記,改用這支做增量。跑它的是 CC/Routine=LLM 本人,**不需任何 token**。
|
||||||
|
- **content_hash 冪等**:讀 `system-dev/wiki/.extract-manifest.json`,逐檔比 sha256;hash 沒變的檔**完全不進 AI**(先擋、不是讀了才發現)。**重跑沒變動的 vault = 零 AI 呼叫、零 diff**。省 run。
|
||||||
|
- **卡片格式不重造**:完全沿用 `/wiki-init` 第五步(frontmatter tags/gloss、`## 實體`、`## 關聯` typed-edge、麵包屑、TAXONOMY 受控標籤)——讓 dev repo 與 vault repo 產出同一種卡,下游一套 ingest 通吃。
|
||||||
|
- **原文唯讀 + D16**:只寫 `system-dev/wiki/`,`journals/`/`pages/` git status 須 0 異動(改了會被 Syncthing 推回 leo 手機污染筆記);精耕知識點、不地毯灌全文。
|
||||||
|
- **新增 Logseq 任務 marker 解析(單一真相源)**:`template/system-dev/docs/4-guides/logseq-markers.md`。Logseq 原生任務是**大寫 marker** block(`- TODO …`/`- DOING …`/`- DONE …`),**不是** GFM `- [ ]`;只抓 checkbox 會漏抓 notes/kb 全部任務(leo 2026-07-04 發現,issue #4 更正)。狀態映射:TODO/LATER→`todo`、DOING/NOW→`in-progress`、WAITING→`blocked`、DONE→`done`、CANCELED/CANCELLED→`closed`;跳過 `:LOGBOOK:…:END:` 與 `key:: value` 屬性行。**這份是唯一權威**——vault 萃取(#5)與 tasks→Project 投影(#4)**共用同一套解析,不各寫一份**。marker → 任務卡 frontmatter `task_status`。
|
||||||
|
- install/update 隨 WIKI 模組帶下 `/wiki-extract`;`logseq-markers.md` 放共用區,wiki 或 sdd 任一模組在用都拿得到。
|
||||||
|
- ⚠️ **邊界**:本能力只產 `system-dev/wiki/` 卡片給下游機械撈;三元組拉取、KBDB 寫入歸下游 Arcrun ingest(另立 issue),不在此。頂層 SDD:`kb-ingest-architecture`(R1 AI 只萃/R2 萃冪等/R5 Logseq 正確性歸 template)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 1.13.0 — tasks.md ⇄ GitHub Project 單向投影(optional 模組,需 Arcrun;issue #16)
|
## 1.13.0 — tasks.md ⇄ GitHub Project 單向投影(optional 模組,需 Arcrun;issue #16)
|
||||||
|
|
||||||
裝了 SDD 的專案可把 `system-dev/docs/3-specs/*/tasks.md` 的待辦**單向投影**成唯讀 GitHub Project(看板/dashboard 好抓)。md 唯一真相源、Project 永遠唯讀,不存在反向同步、不會兩個真相源打架。
|
裝了 SDD 的專案可把 `system-dev/docs/3-specs/*/tasks.md` 的待辦**單向投影**成唯讀 GitHub Project(看板/dashboard 好抓)。md 唯一真相源、Project 永遠唯讀,不存在反向同步、不會兩個真相源打架。
|
||||||
|
|||||||
+1
-1
@@ -44,7 +44,7 @@ SDD 強制 CC 在動手前先思考:這個修改影響哪些地方?有沒有
|
|||||||
|
|
||||||
**雙空間設計:**
|
**雙空間設計:**
|
||||||
- `docs/`:人寫的原始文件,依照開發生命週期分類
|
- `docs/`:人寫的原始文件,依照開發生命週期分類
|
||||||
- `.claude/wiki/`:CC 整理的 LLM 友善知識,每次 session 累積
|
- `system-dev/wiki/`:CC 整理的 LLM 友善知識,每次 session 累積
|
||||||
|
|
||||||
每次 session 開始,CC 讀 wiki,不需要重新學習。
|
每次 session 開始,CC 讀 wiki,不需要重新學習。
|
||||||
每次 session 結束,CC 更新 wiki,知識不再消失。
|
每次 session 結束,CC 更新 wiki,知識不再消失。
|
||||||
|
|||||||
+4
-4
@@ -57,15 +57,15 @@ system-dev-template 自身要補的功能。
|
|||||||
|
|
||||||
| 層 | 機制 | 擋什麼 | 性質 |
|
| 層 | 機制 | 擋什麼 | 性質 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| **L1** | `.claude/wiki/.wikiignore`(glob,像 .gitignore) | 整個機敏檔不編入 | 協議(CC 遵守) |
|
| **L1** | `system-dev/wiki/.wikiignore`(glob,像 .gitignore) | 整個機敏檔不編入 | 協議(CC 遵守) |
|
||||||
| **L2** | 行內標記 `<!-- wiki:ignore -->`…`<!-- wiki:end -->` | 檔案內某段不編入 | 協議(CC 遵守) |
|
| **L2** | 行內標記 `<!-- wiki:ignore -->`…`<!-- wiki:end -->` | 檔案內某段不編入 | 協議(CC 遵守) |
|
||||||
| **L3** | `wiki-secret-scan.sh` hook(PreToolUse) | 機敏值真寫進 `.claude/wiki/` → exit 2 擋 | **硬攔截(機械偵測)** |
|
| **L3** | `wiki-secret-scan.sh` hook(PreToolUse) | 機敏值真寫進 `system-dev/wiki/` → exit 2 擋 | **硬攔截(機械偵測)** |
|
||||||
|
|
||||||
L1/L2 是使用者主動標記,L3 是自動兜底——前兩層漏掉時,寫進 wiki 那一刻 regex 攔下(密碼賦值、PEM 私鑰、AWS/GitHub/Slack/Google/Stripe 金鑰、JWT、連線字串帳密、台灣身分證、信用卡號)。
|
L1/L2 是使用者主動標記,L3 是自動兜底——前兩層漏掉時,寫進 wiki 那一刻 regex 攔下(密碼賦值、PEM 私鑰、AWS/GitHub/Slack/Google/Stripe 金鑰、JWT、連線字串帳密、台灣身分證、信用卡號)。
|
||||||
|
|
||||||
**已做**:
|
**已做**:
|
||||||
- `template/.claude/wiki/.wikiignore`:L1 範本(預設排除 `.env`/`*.pem`/`*secret*` 等)。
|
- `template/system-dev/wiki/.wikiignore`:L1 範本(預設排除 `.env`/`*.pem`/`*secret*` 等)。
|
||||||
- `template/.claude/hooks/wiki-secret-scan.sh`:L3 hook,只掃 `.claude/wiki/**` 寫入,`wiki-secret-ok` 行尾標記可豁免誤判。
|
- `template/.claude/hooks/wiki-secret-scan.sh`:L3 hook,只掃 `system-dev/wiki/**` 寫入,`wiki-secret-ok` 行尾標記可豁免誤判。
|
||||||
- `settings.json`:PreToolUse(Write|Edit) 加掛。
|
- `settings.json`:PreToolUse(Write|Edit) 加掛。
|
||||||
- `wiki-init.md` / `wiki-capture.md` / `SKILL.md`:寫入 L1+L2 協議。
|
- `wiki-init.md` / `wiki-capture.md` / `SKILL.md`:寫入 L1+L2 協議。
|
||||||
|
|
||||||
|
|||||||
@@ -254,6 +254,10 @@ create_dir ".claude/commands"
|
|||||||
create_dir ".claude/hooks"
|
create_dir ".claude/hooks"
|
||||||
download_if_missing "system-dev/docs/README.md" "$REPO_URL/system-dev/docs/README.md"
|
download_if_missing "system-dev/docs/README.md" "$REPO_URL/system-dev/docs/README.md"
|
||||||
|
|
||||||
|
# Logseq 任務 marker 解析(單一真相源):vault 萃取(/wiki-extract)與 tasks→Project
|
||||||
|
# 投影(tasks-project-sync)共用同一套解析,別各寫一份。放共用區,兩模組都拿得到。
|
||||||
|
download_if_missing "system-dev/docs/4-guides/logseq-markers.md" "$REPO_URL/system-dev/docs/4-guides/logseq-markers.md"
|
||||||
|
|
||||||
# 工具版號:放 system-dev/,不寄生 .claude/。
|
# 工具版號:放 system-dev/,不寄生 .claude/。
|
||||||
download_if_missing "system-dev/VERSION" "$REPO_URL/system-dev/VERSION"
|
download_if_missing "system-dev/VERSION" "$REPO_URL/system-dev/VERSION"
|
||||||
|
|
||||||
@@ -277,6 +281,8 @@ if $WANT_WIKI; then
|
|||||||
download_if_missing ".claude/commands/wiki-capture.md" "$REPO_URL/.claude/commands/wiki-capture.md"
|
download_if_missing ".claude/commands/wiki-capture.md" "$REPO_URL/.claude/commands/wiki-capture.md"
|
||||||
download_if_missing ".claude/commands/wiki-update.md" "$REPO_URL/.claude/commands/wiki-update.md"
|
download_if_missing ".claude/commands/wiki-update.md" "$REPO_URL/.claude/commands/wiki-update.md"
|
||||||
download_if_missing ".claude/commands/wiki-recall.md" "$REPO_URL/.claude/commands/wiki-recall.md"
|
download_if_missing ".claude/commands/wiki-recall.md" "$REPO_URL/.claude/commands/wiki-recall.md"
|
||||||
|
# vault 增量萃取(Logseq/Obsidian → system-dev/wiki,冪等):給 Routine 反覆跑。
|
||||||
|
download_if_missing ".claude/commands/wiki-extract.md" "$REPO_URL/.claude/commands/wiki-extract.md"
|
||||||
|
|
||||||
# wiki 相關 hooks:接關 + 機敏掃描
|
# wiki 相關 hooks:接關 + 機敏掃描
|
||||||
download_if_missing ".claude/hooks/session-start-recall.sh" "$REPO_URL/.claude/hooks/session-start-recall.sh"
|
download_if_missing ".claude/hooks/session-start-recall.sh" "$REPO_URL/.claude/hooks/session-start-recall.sh"
|
||||||
|
|||||||
@@ -217,6 +217,12 @@ keep_with_template ".claude/hooks/pre-write-guard.sh" "$TEMPLATE_URL/.claude/hoo
|
|||||||
update_file ".claude/commands/issue-handle.md" "$TEMPLATE_URL/.claude/commands/issue-handle.md"
|
update_file ".claude/commands/issue-handle.md" "$TEMPLATE_URL/.claude/commands/issue-handle.md"
|
||||||
update_file "system-dev/VERSION" "$TEMPLATE_URL/system-dev/VERSION"
|
update_file "system-dev/VERSION" "$TEMPLATE_URL/system-dev/VERSION"
|
||||||
|
|
||||||
|
# Logseq 任務 marker 解析(單一真相源):vault 萃取(/wiki-extract)與 tasks→Project
|
||||||
|
# 投影共用同一套;任一模組在用就補/更新(邏輯檔,可覆蓋)。
|
||||||
|
if $HAS_WIKI || $HAS_SDD; then
|
||||||
|
update_file "system-dev/docs/4-guides/logseq-markers.md" "$TEMPLATE_URL/system-dev/docs/4-guides/logseq-markers.md"
|
||||||
|
fi
|
||||||
|
|
||||||
if $HAS_WIKI; then
|
if $HAS_WIKI; then
|
||||||
# wiki 的「邏輯檔」:導航與 hooks,可覆蓋。wiki 資料在 system-dev/,hooks/commands 留 .claude/。
|
# wiki 的「邏輯檔」:導航與 hooks,可覆蓋。wiki 資料在 system-dev/,hooks/commands 留 .claude/。
|
||||||
update_file "system-dev/wiki/INDEX.md" "$TEMPLATE_URL/system-dev/wiki/INDEX.md"
|
update_file "system-dev/wiki/INDEX.md" "$TEMPLATE_URL/system-dev/wiki/INDEX.md"
|
||||||
@@ -226,6 +232,8 @@ if $HAS_WIKI; then
|
|||||||
update_file ".claude/commands/wiki-capture.md" "$TEMPLATE_URL/.claude/commands/wiki-capture.md"
|
update_file ".claude/commands/wiki-capture.md" "$TEMPLATE_URL/.claude/commands/wiki-capture.md"
|
||||||
update_file ".claude/commands/wiki-update.md" "$TEMPLATE_URL/.claude/commands/wiki-update.md"
|
update_file ".claude/commands/wiki-update.md" "$TEMPLATE_URL/.claude/commands/wiki-update.md"
|
||||||
update_file ".claude/commands/wiki-recall.md" "$TEMPLATE_URL/.claude/commands/wiki-recall.md"
|
update_file ".claude/commands/wiki-recall.md" "$TEMPLATE_URL/.claude/commands/wiki-recall.md"
|
||||||
|
# vault 增量萃取(Logseq/Obsidian → system-dev/wiki,冪等):邏輯檔,可覆蓋。舊版沒有 → 當新檔補。
|
||||||
|
update_file ".claude/commands/wiki-extract.md" "$TEMPLATE_URL/.claude/commands/wiki-extract.md"
|
||||||
# Cowork(claude.ai)的 wiki 整理 skill:規則檔,可覆蓋
|
# Cowork(claude.ai)的 wiki 整理 skill:規則檔,可覆蓋
|
||||||
update_file "system-dev/docs/SKILL.md" "$TEMPLATE_URL/system-dev/docs/SKILL.md"
|
update_file "system-dev/docs/SKILL.md" "$TEMPLATE_URL/system-dev/docs/SKILL.md"
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ description: >-
|
|||||||
│ ├── 4-guides/
|
│ ├── 4-guides/
|
||||||
│ ├── 5-records/{incidents,test-reports}/
|
│ ├── 5-records/{incidents,test-reports}/
|
||||||
│ └── 6-user/
|
│ └── 6-user/
|
||||||
└── .claude/wiki/ ← CC 整理的知識(CC 寫)
|
└── system-dev/wiki/ ← CC 整理的知識(CC 寫)
|
||||||
├── INDEX.md
|
├── INDEX.md
|
||||||
├── mistakes.md
|
├── mistakes.md
|
||||||
├── status.md
|
├── status.md
|
||||||
@@ -63,7 +63,7 @@ description: >-
|
|||||||
|
|
||||||
| 層 | 機制 | 擋什麼 | 性質 |
|
| 層 | 機制 | 擋什麼 | 性質 |
|
||||||
|----|------|--------|------|
|
|----|------|--------|------|
|
||||||
| **L1** | `.claude/wiki/.wikiignore`(glob,像 .gitignore) | 整個機敏檔不編入 | 協議(CC 遵守) |
|
| **L1** | `system-dev/wiki/.wikiignore`(glob,像 .gitignore) | 整個機敏檔不編入 | 協議(CC 遵守) |
|
||||||
| **L2** | 行內標記 `<!-- wiki:ignore -->` … `<!-- wiki:end -->` | 檔案內某段不編入 | 協議(CC 遵守) |
|
| **L2** | 行內標記 `<!-- wiki:ignore -->` … `<!-- wiki:end -->` | 檔案內某段不編入 | 協議(CC 遵守) |
|
||||||
| **L3** | `wiki-secret-scan.sh` hook(PreToolUse) | 機敏值真的寫進 wiki → exit 2 擋 | 硬攔截(機械偵測) |
|
| **L3** | `wiki-secret-scan.sh` hook(PreToolUse) | 機敏值真的寫進 wiki → exit 2 擋 | 硬攔截(機械偵測) |
|
||||||
|
|
||||||
@@ -148,7 +148,7 @@ Session 結束時固定更新 status.md:
|
|||||||
## 維護規則
|
## 維護規則
|
||||||
|
|
||||||
1. `docs/` 只讀不改
|
1. `docs/` 只讀不改
|
||||||
2. `.claude/wiki/` 只增不刪
|
2. `system-dev/wiki/` 只增不刪
|
||||||
3. `CLAUDE.md` 不增長,超過 100 行就是放錯地方
|
3. `CLAUDE.md` 不增長,超過 100 行就是放錯地方
|
||||||
4. 分類不確定就問
|
4. 分類不確定就問
|
||||||
5. 對話結論當場 capture
|
5. 對話結論當場 capture
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
開始任一任務,按順序:
|
開始任一任務,按順序:
|
||||||
|
|
||||||
1. 讀 `.claude/wiki/status.md`(3 分鐘)
|
1. 讀 `system-dev/wiki/status.md`(3 分鐘)
|
||||||
2. 確認有對應 SDD(`docs/3-specs/`)
|
2. 確認有對應 SDD(`docs/3-specs/`)
|
||||||
3. 動手前宣告範圍
|
3. 動手前宣告範圍
|
||||||
4. 完成後更新 wiki
|
4. 完成後更新 wiki
|
||||||
@@ -37,10 +37,10 @@
|
|||||||
|
|
||||||
| 檔案 | 時機 | 用途 |
|
| 檔案 | 時機 | 用途 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| `.claude/wiki/status.md` | session 開始第一件事 | 當前進度、下一步 |
|
| `system-dev/wiki/status.md` | session 開始第一件事 | 當前進度、下一步 |
|
||||||
| `.claude/wiki/mistakes.md` | 做新功能前 | 已知誤解 + 快速檢查清單 |
|
| `system-dev/wiki/mistakes.md` | 做新功能前 | 已知誤解 + 快速檢查清單 |
|
||||||
| `.claude/wiki/decisions-summary.md` | 遇到設計判斷時 | 架構決策快速查 |
|
| `system-dev/wiki/decisions-summary.md` | 遇到設計判斷時 | 架構決策快速查 |
|
||||||
| `.claude/wiki/INDEX.md` | 找不到東西時 | wiki 導引 |
|
| `system-dev/wiki/INDEX.md` | 找不到東西時 | wiki 導引 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -96,10 +96,10 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## .claude/wiki/INDEX.md 範本
|
## system-dev/wiki/INDEX.md 範本
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
# .claude/wiki/ — [專案名稱] LLM 記憶系統
|
# system-dev/wiki/ — [專案名稱] LLM 記憶系統
|
||||||
|
|
||||||
> 新 session 開始時從這裡導航。
|
> 新 session 開始時從這裡導航。
|
||||||
> 目的:讓 CC 不需要重新學習已知的事。
|
> 目的:讓 CC 不需要重新學習已知的事。
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## .claude/wiki/mistakes.md 範本
|
## system-dev/wiki/mistakes.md 範本
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
# CC 已知誤解 + 避坑方法
|
# CC 已知誤解 + 避坑方法
|
||||||
@@ -142,7 +142,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## .claude/wiki/decisions-summary.md 範本
|
## system-dev/wiki/decisions-summary.md 範本
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
# 架構決策摘要
|
# 架構決策摘要
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
1.13.0
|
1.14.0
|
||||||
|
|||||||
@@ -0,0 +1,161 @@
|
|||||||
|
# /wiki-extract — vault 增量萃取(Logseq / Obsidian → system-dev/wiki)
|
||||||
|
|
||||||
|
把**筆記 vault**(Logseq graph 如 `notes`/`kb`、或 Obsidian)的原始筆記,**增量、冪等**地
|
||||||
|
萃成 `system-dev/wiki/` 的精耕卡+`[[wikilink]]`。這是知識一庫 ingest 的**前段**:
|
||||||
|
AI 只產卡片檔,下游 Arcrun ingest 再從 wikilink 機械拉三元組進 KBDB。
|
||||||
|
|
||||||
|
> **跟 `/wiki-init` 的分工**:
|
||||||
|
> - `/wiki-init` 是**首次**建結構 + 全庫首萃(一次性)。
|
||||||
|
> - `/wiki-extract` 是**之後每次**的增量重萃——vault 會被 Syncthing/cron 持續灌新筆記,
|
||||||
|
> 這支負責「只萃變動的、沒變的不碰、不浪費 AI run」。給 Routine / cloud-worker 反覆跑。
|
||||||
|
> - **跑它的是你(CC / Routine)=LLM 本人,不需任何 token**。
|
||||||
|
|
||||||
|
> **邊界(硬規矩,別越界)**
|
||||||
|
> - 只往 `system-dev/wiki/` 寫。**絕不寫入 KBDB、絕不拉三元組紀錄**——三元組是下游
|
||||||
|
> Arcrun 從你產的 `[[wikilink]]` + `## 關聯` 機械映射(另一張 issue),不是這支的事。
|
||||||
|
> - **原始筆記唯讀**:`journals/`、`pages/`、Obsidian 根 `.md` 是 leo 的手寫真身,
|
||||||
|
> 改了會被 Syncthing 推回他手機污染筆記 App。萃取=只讀原文、只寫 wiki。
|
||||||
|
> - **D16 精耕非 RAG**:萃「知識點」成自包含原子卡 + 建 wikilink,**不地毯灌原文全文**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 執行流程
|
||||||
|
|
||||||
|
### 第一步:確認這是 vault repo,定位 raw source
|
||||||
|
|
||||||
|
偵測邏輯**同 install.sh / wiki-init**:
|
||||||
|
|
||||||
|
| 偵測到 | 型態 | raw source(要掃的原文) |
|
||||||
|
|--------|------|--------------------------|
|
||||||
|
| 根目錄有 `logseq/` | Logseq vault | `journals/*.md` + `pages/*.md` |
|
||||||
|
| 根目錄有 `.obsidian/` | Obsidian vault | vault 根下所有 `.md` |
|
||||||
|
| 都沒有 | **不是 vault** | → 停手。這支只處理 vault;一般 dev repo 開發時就手寫 `.claude`/`system-dev/wiki`,不需萃取 |
|
||||||
|
|
||||||
|
沒有 `system-dev/wiki/`?→ 先跑 `/wiki-init`(首次建結構+首萃),再回來用這支做增量。
|
||||||
|
|
||||||
|
### 第二步:content_hash 冪等 —— 決定哪些檔要萃(省 run 的核心)
|
||||||
|
|
||||||
|
讀萃取 manifest:`system-dev/wiki/.extract-manifest.json`(不存在=首次,視同全部要萃)。
|
||||||
|
格式:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"algo": "sha256",
|
||||||
|
"sources": {
|
||||||
|
"journals/2026_07_01.md": {
|
||||||
|
"content_hash": "<sha256 of file bytes>",
|
||||||
|
"extracted_at": "2026-07-06",
|
||||||
|
"cards": ["Prompt能力即拆解自己邏輯的能力", "程式化邏輯可圖解任何主題不限AI"],
|
||||||
|
"skipped_reason": null
|
||||||
|
},
|
||||||
|
"journals/2026_06_25.md": {
|
||||||
|
"content_hash": "<sha256>",
|
||||||
|
"extracted_at": "2026-07-06",
|
||||||
|
"cards": [],
|
||||||
|
"skipped_reason": "空檔/訊息量不足,無可萃知識點"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
對每個 raw source 檔:
|
||||||
|
|
||||||
|
1. 算目前 `content_hash`(`sha256sum <file>`,取檔案 bytes 的 hash)。
|
||||||
|
2. 跟 manifest 裡該檔的 `content_hash` 比:
|
||||||
|
- **相同 → skip,不讀不萃、不呼叫任何 AI 推理**(就算它上次 `cards: []` 也 skip——空檔沒變還是空)。
|
||||||
|
- **不同或不在 manifest → 這檔要(重)萃**。
|
||||||
|
3. manifest 有、但檔已不存在 → 該檔被刪,把它的 entry 從 manifest 移除(卡片是否連帶處理見第五步)。
|
||||||
|
|
||||||
|
> **這一步是「省 run」的重點**:vault 每天可能只動 1~2 個 journal,其餘幾十個檔 hash 沒變
|
||||||
|
> 就整批跳過,AI 只對真正變動的檔動腦。**重跑一個沒變動的 vault = 零 AI 呼叫、零 diff。**
|
||||||
|
|
||||||
|
### 第三步:對「要萃」的檔,抓知識點 + 任務
|
||||||
|
|
||||||
|
逐個變動檔讀原文,分兩類抽取:
|
||||||
|
|
||||||
|
**(a) 知識點 → 概念原子卡**
|
||||||
|
判準與卡片格式**完全依 `/wiki-init` 第五步**(frontmatter `tags:`/`gloss:`、H1、麵包屑
|
||||||
|
`← [[<bucket>/00-INDEX]]`、`**來源**`、`## 摘要`、`## 重點`、`## 實體`、`## 關聯` 的
|
||||||
|
typed-edge 三元組、TAXONOMY 受控標籤、硬自檢等)——**不在這裡重寫格式,一律回去讀那份**。
|
||||||
|
廢話/訊息量薄的段落略過(在 manifest 記 `skipped_reason`,誠實留痕、不留卡)。
|
||||||
|
|
||||||
|
**(b) Logseq 任務 marker → 任務卡(task_status)**
|
||||||
|
解析**完全依** `system-dev/docs/4-guides/logseq-markers.md`(單一真相源,與 template#4
|
||||||
|
tasks 投影共用同一套;**別自己另寫 mapping**)。摘要:
|
||||||
|
|
||||||
|
- 任務行 regex:`^\s*- (TODO|DOING|NOW|LATER|WAITING|DONE|CANCELED|CANCELLED)\s+`
|
||||||
|
- 狀態正規化:TODO/LATER→`todo`、DOING/NOW→`in-progress`、WAITING→`blocked`、
|
||||||
|
DONE→`done`、CANCELED/CANCELLED→`closed`。
|
||||||
|
- 跳過 `:LOGBOOK:…:END:` 區塊與 `key:: value` 屬性行(`collapsed::`、`id::`、
|
||||||
|
`SCHEDULED::`、`DEADLINE::`…),**別把 marker 或屬性當任務內文**。
|
||||||
|
|
||||||
|
有實質內容的任務 → 產一張任務卡進 `cards/tasks/` bucket,frontmatter 帶 `task_status`:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
---
|
||||||
|
tags: [<領域標籤,依 TAXONOMY>]
|
||||||
|
task_status: todo # ← 依上表正規名;這是任務卡才有的欄位
|
||||||
|
gloss: 一句話定義這個任務要達成什麼(供下游 normalize)
|
||||||
|
---
|
||||||
|
# <任務一句話標題(marker 後的內文,去掉 marker)>
|
||||||
|
|
||||||
|
← [[tasks/00-INDEX]]
|
||||||
|
|
||||||
|
**來源**:`journals/2026_07_01.md`(TODO block)
|
||||||
|
**最後更新**:YYYY-MM-DD
|
||||||
|
|
||||||
|
## 摘要
|
||||||
|
[任務要做什麼、脈絡]
|
||||||
|
|
||||||
|
## 實體
|
||||||
|
- **<關鍵實體正規名>**(<同義詞>)— <一句描述>
|
||||||
|
|
||||||
|
## 關聯
|
||||||
|
### 內文知識關係(端點=上方 `## 實體` 正規名,一字不差)
|
||||||
|
- <實體A> >> <謂詞> >> <實體B>
|
||||||
|
### 卡片關係(卡對卡)
|
||||||
|
- [[本任務卡]] >> 涉及 >> [[相關概念卡]]
|
||||||
|
```
|
||||||
|
|
||||||
|
> 純瑣事任務(「買菜」這種無知識量)不必成獨立卡——可在 `cards/tasks/00-INDEX.md`
|
||||||
|
> 列一行帶狀態即可,避免灌垃圾卡。判準同 D16:有沒有知識/專案價值。
|
||||||
|
|
||||||
|
### 第四步:更新桶索引與 INDEX
|
||||||
|
|
||||||
|
- 每個動到的 bucket(如 `cards/notes/`、`cards/tasks/`)更新其 `00-INDEX.md`
|
||||||
|
(容器:只連不重寫,H2/H3 分節)。
|
||||||
|
- 更新 `system-dev/wiki/INDEX.md` 的標籤視圖與卡片清單。
|
||||||
|
- 任務卡可在 INDEX 開一個「任務視圖」按 `task_status` 聚類。
|
||||||
|
|
||||||
|
### 第五步:寫回 manifest + 驗證原文 0 動
|
||||||
|
|
||||||
|
1. 把這次萃過的每個檔的**新 `content_hash`**、`extracted_at`、產出的 `cards`、
|
||||||
|
(或 `skipped_reason`)寫回 `system-dev/wiki/.extract-manifest.json`。
|
||||||
|
**沒動到的檔的 entry 原樣保留**(別整檔重寫掉別人的 hash)。
|
||||||
|
2. 驗證原文零異動(踩過的坑):
|
||||||
|
```
|
||||||
|
git status --short journals/ pages/ # Obsidian 則看根目錄 .md ——須 0 新增 0 修改
|
||||||
|
```
|
||||||
|
有任何原文變動 → 你誤寫了 raw source,回滾。
|
||||||
|
|
||||||
|
### 第六步:完成報告
|
||||||
|
|
||||||
|
```
|
||||||
|
✅ wiki-extract 完成(增量)
|
||||||
|
掃描:N 個 raw source 檔
|
||||||
|
萃取:M 個(content_hash 變動)→ 產出 X 張概念卡 + Y 張任務卡
|
||||||
|
跳過:K 個(hash 未變,零 AI 呼叫)
|
||||||
|
任務狀態分布:todo A / in-progress B / done C / …
|
||||||
|
原文驗證:journals/ pages/ git status 0 異動 ✅
|
||||||
|
manifest:system-dev/wiki/.extract-manifest.json 已更新
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 冪等自檢(Routine 反覆跑必守)
|
||||||
|
|
||||||
|
- [ ] 跑之前先讀 manifest,hash 相同的檔**完全不進 AI**(不是「讀了才發現一樣」,是靠 hash 先擋)。
|
||||||
|
- [ ] 對「同一個沒變動的 vault」連跑兩次:第二次應是**零萃取、零卡片 diff、零 manifest 變化**。
|
||||||
|
- [ ] 只有 `system-dev/wiki/` 有寫入;`journals/`、`pages/` git status 全乾淨。
|
||||||
|
- [ ] 任務狀態用正規名,marker/屬性沒混進內文(照 `logseq-markers.md` 自檢)。
|
||||||
@@ -228,3 +228,8 @@ git status --short pages/ journals/ # 或一般專案的 docs/ ——須 0
|
|||||||
原文驗證:pages/ journals/ git status 0 異動 ✅
|
原文驗證:pages/ journals/ git status 0 異動 ✅
|
||||||
下一步:用 /wiki-capture 把重要決策存進 wiki
|
下一步:用 /wiki-capture 把重要決策存進 wiki
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> **vault repo 首萃後的增量重萃**:Logseq / Obsidian vault 會被持續灌新筆記。首萃(本命令)
|
||||||
|
> 之後,改用 **`/wiki-extract`** 做增量——它靠 content_hash 只萃變動的檔(沒變=零 AI 呼叫),
|
||||||
|
> 並解析 Logseq 大寫任務 marker(TODO/DOING/DONE…→ `task_status`,見
|
||||||
|
> `system-dev/docs/4-guides/logseq-markers.md`)。適合掛給 Routine / cloud-worker 反覆跑。
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
1.13.0
|
1.14.0
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
# Logseq 任務 marker 解析(單一真相源)
|
||||||
|
|
||||||
|
> **這是「Logseq 原生任務語法」解析的唯一權威規格。** 任何要從 Logseq graph
|
||||||
|
> 抓任務狀態的功能,一律 import 這份、不得各寫一份自己的 mapping。
|
||||||
|
>
|
||||||
|
> **已知兩個消費者**(共用同一套解析,見各自 issue):
|
||||||
|
> 1. **vault 萃取**(`/wiki-extract`,template#5):marker → 卡片 frontmatter `task_status`。
|
||||||
|
> 2. **tasks→Project 投影**(`system-dev/workflows/tasks-project-sync.*`,template#4):
|
||||||
|
> 當投影來源是 Logseq graph(notes/kb)時,用這份判斷任務與狀態。
|
||||||
|
>
|
||||||
|
> 兩者**只共用「怎麼 parse」**(哪幾行是任務、marker 是什麼、正規狀態是什麼、跳過什麼);
|
||||||
|
> parse 完各自要「拿狀態做什麼」(寫卡 vs 投影 issue)不同,那部分各管各的。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 為什麼不是 GFM checkbox(規格更正,leo 2026-07-04 發現)
|
||||||
|
|
||||||
|
Logseq 的原生任務**不是** GFM 的 `- [ ]` / `- [x]`,而是**大寫 marker 開頭的 block**:
|
||||||
|
|
||||||
|
```
|
||||||
|
- TODO AI 查看 leo21c 內所有 Repo,找到本地 Repo 搬到 Gitea
|
||||||
|
- DOING 建立知識總庫,可查所有子庫
|
||||||
|
- DONE 手機和電腦 Logseq 可以被放進知識總庫
|
||||||
|
```
|
||||||
|
|
||||||
|
若照舊規格只抓 `- [ ]` checkbox,**notes / kb 兩個 Logseq graph 的任務會全數漏抓**。
|
||||||
|
|
||||||
|
> 兩種源、兩套語法、同一條下游管線:
|
||||||
|
> - **SDD `tasks.md`**(各 repo `system-dev/docs/3-specs/**`)→ GFM checkbox(現行不變)。
|
||||||
|
> - **Logseq graph(notes / kb)** → 本檔的大寫 marker。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 解析規格
|
||||||
|
|
||||||
|
### 1. 任務行辨識(regex)
|
||||||
|
|
||||||
|
```
|
||||||
|
^\s*- (TODO|DOING|NOW|LATER|WAITING|DONE|CANCELED|CANCELLED)\s+
|
||||||
|
```
|
||||||
|
|
||||||
|
- marker 必須是 block(`-` bullet)的**開頭第一個 token**、全大寫、後接空白。
|
||||||
|
- `CANCELED` 與英式 `CANCELLED` 皆收(Logseq 兩種都產)。
|
||||||
|
- marker 後面到行尾(或到子 bullet 之前)是**任務內文**。
|
||||||
|
|
||||||
|
### 2. marker → 正規狀態(task_status)
|
||||||
|
|
||||||
|
| Logseq marker | 正規 task_status |
|
||||||
|
|---------------|------------------|
|
||||||
|
| `TODO`、`LATER` | `todo` |
|
||||||
|
| `DOING`、`NOW` | `in-progress` |
|
||||||
|
| `WAITING` | `blocked` |
|
||||||
|
| `DONE` | `done` |
|
||||||
|
| `CANCELED`、`CANCELLED` | `closed` |
|
||||||
|
|
||||||
|
> `LATER`/`NOW` 是 Logseq「排程視圖」用的同義 marker(LATER≈TODO、NOW≈DOING),
|
||||||
|
> 正規化後與 TODO/DOING 併軌,下游不必區分。
|
||||||
|
|
||||||
|
### 3. 必須跳過的東西(別當任務內文)
|
||||||
|
|
||||||
|
Logseq 的任務 block 底下常掛時間戳與屬性行,這些**不是內文**,解析時整段略過:
|
||||||
|
|
||||||
|
- **`:LOGBOOK:` … `:END:` 區塊**:marker 被點擊計時產生的時間戳紀錄。
|
||||||
|
遇到 `:LOGBOOK:` 那行起、到 `:END:` 那行止(含兩端),整塊丟掉。
|
||||||
|
- **屬性行 `key:: value`**:如 `collapsed:: true`、`id:: 65a...`、`SCHEDULED:: <...>`、
|
||||||
|
`DEADLINE:: <...>`。凡符合 `^\s*[\w-]+:: ` 的行都是屬性,不是內文。
|
||||||
|
(`SCHEDULED`/`DEADLINE` 的日期若下游要用可另抓,但**不得當任務描述文字**。)
|
||||||
|
|
||||||
|
### 4. 巢狀子 bullet
|
||||||
|
|
||||||
|
任務 block 底下縮排的子 bullet 是該任務的補充說明(非獨立任務,除非子 bullet 自己也帶 marker)。
|
||||||
|
萃取時可併入該任務的描述脈絡;投影時只取母 block 那行當任務標題。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 自檢(實作或 LLM 執行前跑一遍)
|
||||||
|
|
||||||
|
- [ ] 用的是大寫 marker regex,**不是** `- [ ]` checkbox。
|
||||||
|
- [ ] 八個 marker 全部覆蓋(含 `LATER`/`NOW`/`CANCELLED` 別漏)。
|
||||||
|
- [ ] `:LOGBOOK:...:END:` 與 `key:: value` 屬性行有跳過,沒混進任務文字。
|
||||||
|
- [ ] 狀態用上表**正規名**(`todo`/`in-progress`/`blocked`/`done`/`closed`),不是原始 marker 字面。
|
||||||
@@ -46,7 +46,7 @@ CC 動手前必須有這兩個檔案。找不到就停手。
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## .claude/wiki/ — CC 的記憶空間(CC 維護,人不手動編輯)
|
## system-dev/wiki/ — CC 的記憶空間(CC 維護,人不手動編輯)
|
||||||
|
|
||||||
| 檔案 | 用途 | 更新時機 |
|
| 檔案 | 用途 | 更新時機 |
|
||||||
|------|------|---------|
|
|------|------|---------|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
# <!-- wiki:ignore -->
|
# <!-- wiki:ignore -->
|
||||||
# 這幾行不會被編入 wiki
|
# 這幾行不會被編入 wiki
|
||||||
# <!-- wiki:end -->
|
# <!-- wiki:end -->
|
||||||
# L3 機械底線:萬一機敏值仍被寫進 .claude/wiki/,wiki-secret-scan.sh 會 exit 2 擋下。
|
# L3 機械底線:萬一機敏值仍被寫進 system-dev/wiki/,wiki-secret-scan.sh 會 exit 2 擋下。
|
||||||
#
|
#
|
||||||
# 三層的分工:L1 整檔排除(你主動列)|L2 局部遮蔽(你標記)|L3 兜底攔截(自動掃)。
|
# 三層的分工:L1 整檔排除(你主動列)|L2 局部遮蔽(你標記)|L3 兜底攔截(自動掃)。
|
||||||
# ────────────────────────────────────────────────────
|
# ────────────────────────────────────────────────────
|
||||||
|
|||||||
Reference in New Issue
Block a user