- 建立 note-html-cleaners.ts 獨立單元測試 — 為 note-html-cleaners.ts 建立 28 個獨立單元測試,涵蓋 stripDuplicateTitle(引號/大小寫/書名號容忍邊界)、stripRenderNoise(noise blockquote 迴圈上限、正文不誤刪、Category 清理、Videos 段移除)、inlineImagePlaceholders(數字對應、## Images 空段清除、src 不跨行、usedSrcs 回傳),全部 1248 tests 通過、tsc 無錯。 (commit: 24ad231, 新增測試: 28)
- 修復 stripRenderNoise ①b 規則的行首錨點缺失 — 將 ①b 規則從
/^.../m全文比對改為只在 trimStart() 後文件開頭比對,確保中間位置的留言引用 blockquote 不被誤剝前綴;同步新增 3 個測試案例驗證邊界行為 (commit: 3f72fa4, 新增測試: 3) - inlineImagePlaceholders:補充 stripImagesSection 最後一段邊界測試並修復 lookahead — 新增 3 個 stripImagesSection 邊界測試(空段落為最後節、後接 ---、所有圖已 inline),測試全綠後確認現有 lookahead regex 已正確處理三種邊界,無需修改 source (commit: 8c5fb1c, 新增測試: 3)
- 完成任務:3/3
- 新增測試數:34
- 修復 stripRenderNoise Videos 段落貪婪吞噬 bug — 將 ## Videos 段落移除正則改為逐行匹配策略,只消費空白行/URL 行/含 URL 的 list 項目;修正原
\n*$在 lazy[\s\S]*?下貪婪吞掉後續純文字段落的資料遺失 bug;新增 4 個回歸測試。 - 修復 inlineImagePlaceholders 空 srcs 時 ## Images 段落未清除 — srcs 為空但 section 含 markdown 圖片語法(hasAnyImg=true)時,判定為全不可渲染圖片段落,直接移除;新增 1 個 failing test 確認紅燈後修復。全套 1311 tests 通過。
- 新增 27 個單元測試覆蓋 illustration SVG 純函式 — isFluorescentHex / checkStyleViolations / sanitizeSvg / pickEnsembleWinner 四個純函式全部覆蓋,全部通過。
- 新增 17 個單元測試覆蓋 omlx-client-helpers builder 純函式 — buildAuthHeaders / buildOmlxMessages / buildChatCompletionBody / buildVisionCompletionBody / getOmlxTimeouts 全路徑覆蓋。
- 新增 signal-scorer.test.ts — 覆蓋 computeSignalScore 各計分維度(關鍵字/摘要/分析/文字長度/平台信任度)邊界值與上限,以及 getSignalTag 三個閾值分支。
- 完成任務:8/8(累計)
- 新增測試數:83(累計;本輪 +49)
- 新增 DANGEROUS_HREF_RE 攔截危險協定 — 攔截 javascript: / data: / vbscript: / 協定相對 URL(//),補 4 個 failing test 確認紅燈後修復,全測試 1340/1340 通過。
- 修復巢狀 svg 時外層內容被截斷 — 將 raw.search(SVG_CLOSE_RE) 改為 raw.lastIndexOf(''),正確保留外層 SVG 內容;補測試「巢狀 時保留外層內容」。
- 收窄 catch-all regex 防止誤刪正文 — 第 140 行 catch-all 拆為兩個更窄 pattern,要求前綴 [ 必須存在,防止裸字串「View original」被靜默刪除。
- 新增 url-parser 13 個單元測試 — 涵蓋 reddit/youtube/github 平台命中、未知 URL 回 null、extractUrls 混合文字/CJK/邊界案例,tsc 與全量測試全綠。
- 新增 TtlCache 8 個單元測試 — 覆蓋 set/get、TTL 過期、覆寫重置計時器、maxSize 淘汰、delete,使用 vitest fakeTimers 不依賴真實時鐘。
- 完成任務:13/13(累計)
- 新增測試數:109(累計;本輪 +26)
- 新增 fetch-with-timeout.test.ts — 覆蓋逾時拋出 AbortError、成功不重試、指數退避重試、達上限拋出、maxRetries=1 立即拋出共 6 個測試,使用 vitest fake timers + mock fetch 無真實 IO。
- 新增 src/utils/jsonl.test.ts — 涵蓋空檔/不存在檔案/malformed JSON 跳過/maxLines 截斷方向/appendJsonl newline 格式,共 10 個測試全過。
- 新增 content-filter.test.ts — 12 個測試覆蓋 isBlockedContent 所有邊界:空 filter、分類比對、未定義 category/title、關鍵字大小寫不敏感、空關鍵字陣列、substring 安全性(ads vs attachments)、分類與關鍵字並存。
- 新增 ad-url-filter.test.ts — 19 個測試涵蓋靜態廣告 URL 命中、黑名單域名、subdomain 邊界、正常 URL 不誤判、動態黑名單 mock fs;同時在 ad-url-filter.ts 新增
_resetCacheForTestingexport 供測試隔離模組快取。
- 完成任務:17/17(累計)
- 新增測試數:156(累計;本輪 +47)
- 修復全形數字圖片佔位符殘留 — note-html-cleaners.ts 的 inlineImagePlaceholders regex 從
\d+改為[0-90-9]+並 normalize 全形數字為半形,修復 LLM 輸出[圖片1]時佔位符殘留 HTML 的問題。 - 新增 escapeHtml 單元測試 — 7 個測試案例涵蓋 &、<、>、複合輸入、空字串、雙重跳脫防護,全數通過。
- 新增 rss-parser.test.ts — 14 個測試案例涵蓋 parseXmlFeed(RSS/Atom/CDATA/實體/缺欄位/空輸入)與 normalizePubDate(undefined/空字串/ISO/RFC2822/無效日期),全數通過。
- 新增 content-sanitizer.test.ts — 11 個測試案例涵蓋空字串、7 種敏感模式遮蔽(API Key/GitHub Token/AWS Key/Google Key/Bot Token/PEM 私鑰/JWT)及多敏感字樣 redacted 計數正確性,全部通過。
- 刪除死碼 context-manifest.ts — 移除 193 行無任何 import 的死碼檔案,全專案 1389 個測試全過。
- 完成任務:22/22(累計)
- 新增測試數:188(累計;本輪 +32)
- 修復 SVG 大小寫結束標籤誤判 — illustration-svg-sanitize.ts 改用
raw.toLowerCase().lastIndexOf('</svg>')取代區分大小寫的比對,修復 LLM 輸出</SVG>時被誤判為 invalid-svg 的問題;新增 2 個測試驗證大寫/全大寫標籤均可通過。 - 修復 formatter stats 貪婪捕捉 — ①c regex 新增負向前瞻
(?!\|?\s*StatKey:)防止最後一個 stat 欄位被貪婪捕捉為正文;新增 ①c-pure 分支將無正文的純 stats 行轉為 .video-meta badge。 - 刪除死碼 scripts/sync-context.ts — 該腳本依賴已刪除的 src/utils/context-manifest.ts,無法執行且無核心程式碼引用,直接移除。
- 新增 dislike-action.test.ts — 8 個測試涵蓋 3 種 remember→resolve round-trip、非法/空 token 回 null、特殊字元不崩潰、多 token 互不干擾,全數通過。
- 新增 cost-tracker.test.ts — 10 個測試涵蓋 estimateTokens(空字串/CJK/Latin/混合/極長文本)與 formatCostStats(totalCost/callCount/month/0 成本/空 byTier),全數通過。
- 完成任務:27/27(累計)
- 新增測試數:208(累計;本輪 +20)
- 修復 COLOR_ATTR_RE lastIndex 副作用 — 將 illustration-svg-sanitize.ts 中模組層級的
/giregex 常數移至 checkStyleViolations 函式內局部宣告,每次呼叫建立新實例,消除 stateful lastIndex 跨呼叫汙染;新增回歸測試確認連續呼叫結果一致。 - 新增 index.test.ts(note-html-cleaners) — 7 個測試涵蓋空字串不 crash、多餘空行壓縮、code block 保護、frontmatter 原樣保留、changed 旗標正確性,全量測試通過。
- 新增 html-to-markdown.test.ts — 9 個測試涵蓋 htmlFragmentToMarkdown(空輸入/a/strong/em/pre/ul/ol)與 htmlToMarkdown(script/style 過濾),全數通過。
- 新增 incident-log.test.ts — 12 個測試以 vi.mock 隔離 fs,覆蓋 logIncident/getRecentIncidents/getDailyDigest/rotateIfNeeded 全部函式,全量測試通過。
- 完成任務:31/31(累計)
- 新增測試數:236(累計;本輪 +28)
- 修復 parseYamlArrayLiteral 跳脫引號 — 在 inQuote 狀態下偵測前一字元為反斜線時跳過引號結束判斷,並將跳脫序列
\"還原為真正的引號字元,修復含跳脫引號的 YAML 陣列解析錯誤。 - 修復 inlineImagePlaceholders idx-1=-1 越界 —
[圖片0]因 idx-1=-1 取到 undefined 進入 fallback;改為 idx===0 → srcs[0],支援 0-based 與 1-based 兩種 LLM 編號方式,新增 2 個回歸測試。 - 修復 stripImagesSection ReDoS 風險 — 將
[\s\S]*?正則改為 indexOf 逐行掃描,消除大型無 Images 段落的 O(n²) 效能風險;新增 5000 行無 Images 段落的 200ms 效能邊界測試。 - 新增 illustration-profiles.test.ts — 11 個測試涵蓋 getProfile(已知 id、預設值)、listProfiles(全 3 個 profile、欄位完整性)、renderPrompt(插值正確、截斷邊界、多 profile 輸出差異),全數通過。
- 完成任務:35/35(累計)
- 新增測試數:249(累計;本輪 +13)
- 修復 sanitizeSvg null byte 繞過 — 在禁止字元檢查前加入
.replace(/\x00/g, '')正規化,防止 null byte 插入繞過 FORBIDDEN_RE;補充 failing test 鎖死此邊界。 - 修復 inlineImagePlaceholders XSS 注入 — 對 caption 做 HTML 跳脫(
& < > " '),防止惡意 HTML 標籤注入;新增回歸測試確認惡意輸入被正確轉義。 - 新增 omlx-client.test.ts — 9 個測試涵蓋 getOmlxModelId(3)、getOmlxTimeout(3)、isOmlxAvailable(3),全數通過。
- 新增 local-llm.test.ts — 7 個邊界測試涵蓋 cleanOpenCodeOutput:ANSI 清除、thinking block 過濾、空白行過濾、合法 JSON 保留、複合情境、trim、空輸入,全數通過。
- 新增 knowledge-aggregator.test.ts — 17 個測試涵蓋 5 個純函式(空輸入、limit 截斷、排序、篩選、recentCount 邊界),全部通過。
- 完成任務:40/40(累計)
- 新增測試數:283(累計;本輪 +34)
- 修復 makeInsight type: 'learning' 型別錯誤 — 將非法值
'learning'改為合法的'principle',消除 TS2820 型別錯誤。 - 修復 Buffer 強制轉型相容性錯誤 — 將
as unknown as Buffer強轉改為Buffer.from(JSON.stringify(...)),消除第 122、142 行 TS2345 錯誤,19 個測試全過。 - 修復 ## Videos 後純文字行標題殘留 bug — note-html-cleaners.ts 第 ⑦ 規則新增純文字行(不含 URL)分支,區分「有 URL 行」與「無 URL 純文字行」兩種情況分別清除,1550 個測試全過。
- 新增 knowledge-graph.test.ts — 15 個測試涵蓋 buildEntityGraph、findRelatedNotes(limit 截斷)、detectKnowledgeGaps(gap 偵測 + 排序)、formatGraph、formatGapsSummary 5 個純函式,全部綠燈。
- 新增 chapter-detector.test.ts — 9 個測試涵蓋空輸入、影片過短、足夠長影片產生 ≥3 章節、欄位完整性、時間戳格式、標題長度限制、中英混合標題、章節數不足回傳空陣列、超過 1 小時時間戳正確性。
- 完成任務:45/45(累計)
- 新增測試數:307(累計;本輪 +24)
- 修復 sanitizeSvg LONG_TEXT_RE null byte 繞過 — 將
LONG_TEXT_RE.test(svg)改為LONG_TEXT_RE.test(svgNormalized),確保 null byte 插入超長 text 時仍被正確攔截;新增 null byte bypass 測試案例。 - 修復 stripDuplicateTitle 空 norm 邊界案例 — 新增
if (!target) return body守衛,當 title 只含標點符號導致 norm() 回傳空字串時提前返回,避免誤刪 heading;修復 Edit 工具導致的 norm regex 引號字元損壞(e2809c→e2809d);新增 2 個回歸測試。 - 修復 stats regex /gm 跨行誤吞 — ①c stats regex 改
/gm(兩條規則),並將\s+改[ \t]+避免跨行吃掉下一條 stats 行。 - 新增 html.test.ts — 8 個測試涵蓋 escapeHtml,並修復遺漏的
"和'跳脫("/')。 - 新增 user-config.test.ts — 9 個測試涵蓋 deepMerge 巢狀覆蓋、undefined patch、未知 key 等案例,以及 getEnabledPlatforms disabled 過濾、全禁用回空陣列等邊界案例,全部通過。
- 完成任務:50/50(累計)
- 新增測試數:326(累計;本輪 +19)
- 修復 buildHtml hero CSS url() 跳脫 — 對 heroMatch[1] 套用與 safeHero 相同的 %27(單引號)與 %3E(>)跳脫邏輯,防止 hero URL 含特殊字元時 CSS 語法破損;新增 3 個測試覆蓋跳脫行為。
- 修復 stripDuplicateTitle dash 類字符正規化 — norm() 加入 U+2014/2013/2012/2010 及 ASCII - 映射,修復 '— Introduction —' 類標題 false negative;title norm 後空字串由 !target 守門防誤刪(false positive);新增 4 個 edge case 測試。
- 新增 postProcessBody 34 個測試 — 覆蓋空字串邊界、孤立格式符移除、HR 折疊、ol 合併(含 mid 超 3000 字元不合併)、gallery、link-card、callout、lead paragraph 等所有轉換邏輯分支。
- 新增 camoufox-pool.test.ts — 覆蓋租借→歸還、5 分鐘逾時清理、並發上限 MAX_SIZE=4、重複 release 不拋例外共 4 個回歸測試。
- 新增 transcript-service.test.ts — 涵蓋 formatTimestamp 6 個邊界案例、extractAudio 成功/失敗、whisperTranscribe 三種分支、fetchYouTubeTranscript 四種分支,共 15 個測試。
- 完成任務:55/55(累計)
- 新增測試數:354(累計;本輪 +28)
- 修復 stripImages 末行邊界 —
afterHeader === -1時改為return s.slice(0, segStart),正確截除## Images為末行時的整段;新增isAtStart=true與有前置內容兩個邊界測試。 - 修復 sanitizeSvg null byte 繞過 — 將
checkStyleViolations(svg)改為checkStyleViolations(svgNormalized),防止 null byte 插入 linearGradient 等標籤繞過美學規則;新增攻擊向量回歸測試。 - 新增 force-reply.test.ts — 10 個測試涵蓋標記格式、邊界情況與
forceReplyMarkup欄位輸出。 - 新增 scoreIndexEntries 邊界測試 — 6 個測試:空 words、無匹配過濾、keyword 精確命中、多字詞部分命中、minCoverage 門檻、分數大小關係。
- 新增 access-log.test.ts — 14 個測試涵蓋
recordQuery/recordNoteAccess寫入格式驗證與getRecentNoteAccesses日期篩選邊界(days=0、跨月、無檔案)。
- 完成任務:60/60(累計)
- 新增測試數:391(累計;本輪 +37)
- 修復 stripReasoningLeakage 未閉合 tag fallback — 偵測到孤立
<think>等開頭 tag 時,截取第一個換行後的內容;無換行則回傳空字串;新增 3 個回歸測試。 - 修復 review-stats summarizeByPersona 資料丟棄 — 將
groups.get(s.persona)?.push(s)改為groups.get(s.persona)!.push(s),防止初始化後 map lookup 誤判 undefined;加 biome-ignore 注解;新增多 persona 不丟棄資料測試(14 tests pass)。 - 新增 knowledge-store 單元測試 18 cases — 涵蓋 computeContentHash、shouldAnalyze、buildNoteAnalysis、cleanupDeletedNotes 四個函式的邊界條件與欄位映射驗證。
- 新增 classifier-evolver.test.ts 12 cases — 覆蓋 generateRuleVariants(空輸入、variant 數量上限、結構、閾值過濾、空 variant 過濾)與 evaluateVariants(空 evalSet/variants、標題/內文命中、分類不符、multi-note precision、variant 參照)。
- 新增 link-suggester 單元測試 8 cases — noteBasename 路徑/副檔名去除、suggestLinks 空索引/排除自身/關鍵字排序/同類別/limit 選項。
- 完成任務:65/65(累計)
- 新增測試數:442(累計;本輪 +51)
- 修復 sanitizeSvg 成功路徑回傳值 — 將回傳值從
svg(原始切片,含 null byte)改為svgNormalized(已清除 null byte),防止 null byte 繞過美學守門;新增 failing test 確認修復。 - 新增 json-extractor 邊界測試(4 個) — surrogate-pair emoji 解析不拋出、requiredKey 不存在回傳 null、空陣列回傳 null、混合型別陣列回傳 null;現有 16 個測試全數通過,共 20 個全綠。
- 新增 frontmatter-rewriter 邊界測試(7 個) — frontmatter 含冒號值不破壞 body、無 frontmatter 回 null、key 覆蓋不重複、serializeStringArray 含逗號/單引號保留。
- 新增回歸測試(4 個) — reasoning 跨行剝除、thinking 巢狀換行剝除、dedup 不重複輸入保持原樣、dedup 空字串不拋出;27 個測試全綠。
- 新增 isFluorescentHex 邊界測試(4 個) — NaN guard 路徑(#gg0000、空字串、#、大寫 #F00),確保防護被移除時能即時偵測 regression。
- 完成任務:70/70(累計)
- 新增測試數:461(累計;本輪 +19)
- s2tw 改用 OpenCC twp 變體 — 繁化台灣 IT 詞彙(軟體 / 網路 / 記憶體),同步更新 README 翻譯說明;新增 5 例測試;tsc 綠,唯一全量失敗為 access-log 既有時間邊界 flake,與本改動無關。
- buildCardsMessage 純函式補測(8 例) — 空陣列、切句過濾 length>10 最多 5、全短句 fallback slice(0,80)、title slice(0,40)、標頭/指令行、pickStyle/pickLayout 分支、多卡片;tsc 通過,新測試全綠。
- 完成任務:72/72(累計)
- 新增測試數:474(累計;本輪 +13)
- 驗證 note-html-cleaners 全寬數字圖片佔位符處理 — finding 描述的 bug 不存在:第 297/299 行已用
[0-90-9]+匹配並正規化全寬數字為半形。新增 2 個回歸測試鎖死[圖片1]/[圖片0]行為;全量 tsc + 1732 測試全綠。
- 完成任務:73/73(累計)
- 新增測試數:476(累計;本輪 +2)