|
|
b90727fc11
|
feat: diag_refs 對帳診斷 + ingest 進度可見性/Ctrl-C 安全 (Closes #2) (#5)
## 摘要
本 PR 含兩個獨立關注點,各一 commit。
### 1. `diag_refs` — source_ref↔manifest 對帳診斷 (`04f4fd5`) — 回應 #4
lint 的「source_ref 不在 manifest」只報對不上、不辨成因。新增 `tools/diag_refs.py`,把每個對不上的 source_ref 分成五類(hash 不符/路徑字串岔開/檔名 hash 後綴岔開/檔在磁碟未登記/完全無對應),各附修法,讓「補帳本(§14.3)」與「修規則(§12)」的相反處置不再混為一談。純唯讀、結束碼 `0/1`,可當搬機或改 manifest 後的閘門。附 selfcheck 驗五型別分類、結束碼與零寫檔。README §3.3/§6/§7/§8 同步。
### 2. ingest 進度可見性 + Ctrl-C 安全回復 (`4add7fa`) — Closes #2
`--all-pending` 長時間本地 Ollama 攝入全程靜默,使用者不確定有沒有在跑、又不敢中斷:
- **進度可見**:每份來源 `[i/N]`、長文件逐段 `分段 k/n`、每個 item `↳ 新增/更新`、完成 `✓`,全 `flush=True` 即時顯示。
- **Ctrl-C 安全**:獨立攔 `KeyboardInterrupt`(它不是 `Exception` 子類,原本會略過善後)。因 commit 在迴圈之後,**main 必然未受影響**;中斷時印可照做的回復指令並以結束碼 130 收場。
## 測試
- `python tools/selfcheck_diag_refs.py` — ALL PASS
- `python tools/selfcheck_ingest.py` — ALL PASS(含進度標記、中斷後 main 未動、回復指令實測可回乾淨 main)
- README markdownlint 0 issues
Closes #2
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: LittleYellow <crazytea@gmail.com>
Reviewed-on: #5
|
2026-07-24 05:42:35 +00:00 |
|
|
|
356ae9367c
|
feat: convert --verify 對帳 + 修復 CRLF 使 hash 失準 + raw/** .gitattributes (#1)
## 目的
`convert` 後檔案被手動刪除/就地改動時,提供正規的稽核與修復途徑;並修掉一個讓「還原後 re-hash 比對」在 Windows 失效的既有 bug。
## 變更
- **`convert.py --verify`(純唯讀對帳)**:re-hash 全部登記檔、掃未登記檔,回報 missing / mismatch / unregistered,不一致以退出碼 1 表示(可當 CI/排程閘門)。`converted/assets/*` 與 `.gitkeep` 正確略過。
- **修 CRLF 使 hash 失準**:`write_text` 在 Windows 把 `\n`→`\r\n`,但登記的 SHA-256 算在 `\n` bytes 上 → 磁碟 bytes 與帳本永遠對不上(converted md + web 快照原始檔)。改為 `write_bytes` 寫入所登記的那份 bytes。
- **`.gitattributes`(`raw/** -text`)**:`core.autocrlf=true` 下 checkout 會在 git 層重新引入 CRLF,抵銷上一項修復;關閉 raw 的換行正規化,把「登記 hash == 磁碟 bytes」不變式延伸到 git checkin/checkout。
- **selfcheck**:補 clean / missing / mismatch / unregistered 四情境(全程唯讀斷言;clean 案例含未入帳本的 assets,順帶證明不誤報)。
- **AGENTS.md**:新增 §14「raw 完整性與修復(對帳)」,並於 §1.4 補「登記 hash == 磁碟 bytes」不變式與 `.gitattributes` 機制。
## 驗證
`.venv/Scripts/python.exe tools/convert/selfcheck.py` → `ALL PASS`。
## 備註
`--verify` 是唯讀稽核工具,不改任何檔(含 manifest),符合 §7「lint 絕不擅自刪改」精神。修復決策(可衍生 vs 信任根、先 `git restore` 不改帳本、動 manifest 走 PR)詳見 AGENTS.md §14。
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: LittleYellow <crazytea@gmail.com>
Reviewed-on: #1
|
2026-07-23 02:27:47 +00:00 |
|
LittleYellow
|
cb16e8688f
|
chore: .markdownlint.jsonc 明確關閉 MD013,避免被動啟用
前一個 commit 新增 .markdownlint.jsonc(關 MD060)時,該檔一存在就會取代
VS Code markdownlint 擴充的內建預設集,而預設集本來關著 MD013——等於間接把
行長檢查打開,讓既有檔案(CJK 表格、逐字保存的 bootstrap prompt)冒出大量
新警告。明確設 MD013:false 恢復專案原本行為,並註明日後想啟用該如何調整。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-07-23 06:13:04 +08:00 |
|
LittleYellow
|
3c1b268074
|
修復含空格/括號檔名的圖片連結失效,自檢改驗連結可 render
來源檔名含空格或不平衡括號時,convert 產出的 Markdown 圖片連結會失效——
圖檔明明存在於磁碟,整行卻退化成純文字(CommonMark 對未包住的空格與不平衡
括號視為分隔符)。用真 CommonMark parser 驗過:中文與成對括號正常,空格與
落單括號會壞。
- convert.py / from_docx.py / from_pdf.py / from_pptx.py:四處圖片連結目標
一律以 <> 包住(),同時涵蓋空格與不平衡括號。
- selfcheck.py:新增 assert_links_ok()——以 markdown_it 真 render,斷言圖片
連結數 == <img> 數且目標檔存在,取代原本只檢查 "![" 字串在不在的表面斷言。
測資補內嵌圖片(docx/pdf/pptx 各一路徑)、檔名改含空格與不平衡括號。
- requirements.txt:明確宣告 markdown-it-py(原為 fastmcp 傳遞依賴,自檢直接
使用,宣告以免上游調整依賴樹後自檢失效)。
- AGENTS.md §13.4:新增「斷言要驗結果可用,不是驗字串存在」規則。
驗證:四個自檢全通過;移除任一處 <> 修法,assert_links_ok 即失敗。
ingest / lint / search 在含括號檔名下全鏈路已另行驗證正常(source_ref 走
YAML 純量,不受影響)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-07-23 06:12:47 +08:00 |
|
LittleYellow
|
b2eb4fbfa3
|
docs: 清除 markdown lint 警告(MD040 補語言標註、MD060 關閉)
- MD040:AGENTS.md 四處與 README.md 一處的 fenced code block 補上語言標註
(目錄樹與格式範例用 text,index.md / log.md 的範例用 markdown)。
- MD060:本專案文件表格一律按終端顯示寬度對齊(CJK 佔 2 欄),而 MD060 以
字元位置比對管線符號,對 CJK 無感,兩者不可能同時滿足。選擇保留顯示寬度
對齊(人類在編輯器裡讀得順),以 .markdownlint.jsonc 關閉該規則並註明理由。
順帶修正 AGENTS.md §3.1 表格 entity 列的對齊——該列混入 ASCII 的 API,
原本比其他列短 1 欄。
未處理 MD013(行長 > 80):VS Code 的 markdownlint 擴充預設不啟用此規則,
且 §3.1 表格在維持顯示對齊的前提下無法壓到 80 字元以內。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-07-22 07:35:44 +08:00 |
|
LittleYellow
|
0b4c2bbb15
|
修復中文路徑 preflight 與 BM25 核心詞落空,測資改照現實建
兩個 bug 同源於自檢測資「照能過建、不照現實建」:
- ingest preflight:git status --porcelain 預設會把含中文或空格的路徑加引號
轉義,raw/ 白名單比對因此失效,中文檔名的 convert 產出被誤判為 raw/ 以外的
未提交變更而中止攝入。舊測資用 ASCII 檔名,整條路徑從未被走過。
- search:BM25Okapi 的 idf 在 df >= N/2 時 <= 0(rank_bm25 對負 idf 的替代值
epsilon x average_idf 在 average_idf 為負時同樣為負),與 search() 的 s > 0
過濾相乘,會讓「每頁都提到的核心詞」查詢全數落空——知識庫愈小、詞愈核心
愈嚴重,MCP 的 search_wiki 一併受害。改用 Lucene 式恆正 idf。
舊測資每個查詢詞都只出現在一頁(df=1),恰好避開此配置。
變更:
- tools/ingest.py:preflight 比對前剝除 git 的轉義引號
- tools/search.py:_BM25 子類覆寫 _calc_idf 為 log(1 + (N-df+0.5)/(df+0.5))
- tools/selfcheck_ingest.py:新增 preflight 中文檔名放行 / 非 raw 擋下的檢查
- tools/selfcheck_search.py:新增與既有頁共用核心詞的測資,鎖住 idf 退化
- tools/convert/selfcheck.py、tools/selfcheck_lint.py:測資檔名改中文+空格
- AGENTS.md §13.4:新增「測資照現實建,不是照能過建」規則
- README.md §3.2:補 convert 產出應保持未提交、由 ingest 一併 commit 的流程
驗證:四個自檢全數通過;分別移除兩個修法後對應檢查會失敗。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-07-22 07:21:45 +08:00 |
|
LittleYellow
|
cfd1876359
|
轉換工具強化:失敗診斷訊息 + 舊版格式升版 + 掃描 PDF vision fallback
- convert.py:轉換失敗改印例外型別、批次尾端彙總、--traceback 旗標;
空白轉換結果示警(避免純圖片 docx 等假成功靜默入庫)
- from_legacy.py(B):.doc/.xls/.ppt 經本地 LibreOffice headless 升版為
現代格式後再走既有轉換器;raw/originals 仍保存真正的舊格式原始檔
- to_image.py + from_vision.py(A):needs_ocr 的掃描/圖片型 PDF 逐頁
render → 本地 vision 模型轉錄(--vision);:cloud/未設定防護,
模型設定走 config/models.yaml 的 tasks.vision(預設不啟用)
- kb.ollama_chat 加 images 參數(向後相容);models.yaml 加 vision 範例
- selfcheck 補 legacy 路由、to_image 真測、from_vision 注入測、
--vision 端到端,全數 ALL PASS
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-07-21 07:00:32 +08:00 |
|
LittleYellow
|
1d1454e1b9
|
docs: 新增 README 使用手冊
操作導向的安裝/使用說明(環境、四大工作流、MCP、疑難排解);
schema 與規則仍以 AGENTS.md 為正本,不複製其內容(§11 雙棧規則)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-07-21 07:00:21 +08:00 |
|
LittleYellow
|
cb2c92452e
|
Phase 5: MCP 薄殼(search_wiki/read_page)+ BM25 檢索 + 三個 Copilot Custom Agents
kb-lint / lint (push) Has been cancelled
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 21:05:01 +08:00 |
|
LittleYellow
|
156c6db2f8
|
Phase 4: Lint — 五類健檢 + LLM 重複/矛盾偵測 + Gitea Actions 草稿 + selfcheck
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 21:01:37 +08:00 |
|
LittleYellow
|
f9a863e271
|
Phase 3: 攝入管線 — kb.py 共用模組 + ingest.py(重試/fallback/branch+PR)+ selfcheck
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 20:58:30 +08:00 |
|
LittleYellow
|
8d58436f05
|
Phase 2: 轉換管線 — 五個本地轉換器 + convert.py 統一入口 + selfcheck
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 20:51:17 +08:00 |
|
LittleYellow
|
59c16ea393
|
Phase 1: 骨架與 schema — 目錄結構、AGENTS.md 正本、指標檔、models.yaml、index/log 模板、manifest 結構
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 07:42:45 +08:00 |
|