Problem
Original text :
「B,那些應該要是套件才對」
— Source: Claude Code session 2026-04-17, idd-implement #77 途中觸發 scope guard
macdoc .gitignore L20-21 註解寫道:
# Local packages & MCP (separate git repos)
packages/
但實際狀態:
Package
.gitignore 白名單
獨立 .git
Remote repo
正常版控?
srt-to-html-swift
✅
?
?
是(經 whitelist)
md-to-html-swift
✅
?
?
是(經 whitelist)
html-to-md-swift
✅
?
?
是(經 whitelist)
marker-word-converter-swift
✅
?
?
是(經 whitelist)
common-converter-swift
N/A
N/A
PsychQuant/common-converter-swift
是(remote dep)
word-to-md-swift
N/A
N/A
PsychQuant/word-to-md-swift
是(remote dep)
note-core-swift
❌
❌
❌
否
note-to-pdf-swift
❌
❌
❌
否
note-to-html-swift
❌
❌
❌
否
note-core-swift / note-to-pdf-swift / note-to-html-swift 既不在白名單、又沒獨立 .git、也沒有對應的 PsychQuant/* remote repo — 意味著 #76 (note-to-pdf 發布) 的原始碼只存在開發者的 local filesystem,沒納入任何版本控制 。
Type
refactor
Expected
三個 Note-相關 packages 跟 common-converter-swift / word-to-md-swift 同樣處理:獨立成 PsychQuant GitHub repos,用 remoteSourceControl 依賴 。
// 目標狀態:Package.swift
. package ( url: " https://github.com/PsychQuant/note-core-swift.git " , from: " 0.1.0 " ) ,
. package ( url: " https://github.com/PsychQuant/note-to-pdf-swift.git " , from: " 0.1.0 " ) ,
. package ( url: " https://github.com/PsychQuant/note-to-html-swift.git " , from: " 0.1.0 " ) ,
Actual
目前三個 packages 都用 local path: 依賴且完全無版本控制:
. package ( name: " NoteToHTML " , path: " packages/note-to-html-swift " ) ,
. package ( name: " NoteToPDF " , path: " packages/note-to-pdf-swift " ) ,
// NoteCore 由 NoteToHTML / NoteToPDF 間接依賴
Source files 只在開發者 local(macdoc v0.5.0 binary 能跑,但無法 collaborate / PR / audit)。
Impact
無法 collaborate :第二位開發者從頭 clone macdoc 缺少三個 packages 的 source → 無法 build
無法 PR review :改動 NoteCore 邏輯無 diff 可看
無 audit trail :git log 查不到 packages 歷史
Blocks bug: .note → pdf 分頁切錯(筆畫橫跨頁邊界、空白不合理分布) #77 :#77 修的 bug 位於 packages/note-core-swift/Sources/NoteCore/NoteParser.swift:154-159,已完成實作 + 單元測試,但無法 commit (被 .gitignore 擋、也沒有 remote repo 可以 push)
Strategy
三個 packages 依相依順序處理:
Phase 1 — NoteCore(基礎,無下游內部依賴)
Phase 2 — NoteToPDF
Phase 3 — NoteToHTML
Phase 4 — Verification
Blockers / Dependencies
Notes
Current Status
Phase : closed
Last updated : 2026-04-18 by idd-close
Key Decisions
Closed 2026-04-18 — PASS WITH NOTES; declared scope (Phase 1-3) FULLY done; Phase 4 PARTIALLY (literal clean-clone deferred to refactor: extract pdf-to-latex-swift + ocr-swift to PsychQuant repos; commit Tests/WordToMDTests fixtures (continues #78 pattern) #79 )
Verify 2026-04-18 via 5 Claude reviewers + Codex (gpt-5.4 xhigh) ensemble; Devil's Advocate counter-evidence accepted
3 follow-up issues filed for non-blocking findings: refactor: extract pdf-to-latex-swift + ocr-swift to PsychQuant repos; commit Tests/WordToMDTests fixtures (continues #78 pattern) #79 (gitignored packages systemic), security: enable GitHub security defaults (secret scanning, branch protection, dependabot) across PsychQuant org repos #80 (org-wide repo security), test: add NoteConvertTests smoke coverage (.note → pdf/html) to MacDocCLITests #81 (NoteConvert smoke tests)
Latent regression caught + fixed: Package.resolved had downgraded note-to-pdf-swift 0.1.2 → 0.1.0 due to feat: 新增 word-builder-swift — Swift fluent API 直接寫 .docx(類 docx.js) #71 wiring; restored 0.1.2 via swift package update; bug: .note → pdf 分頁切錯(筆畫橫跨頁邊界、空白不合理分布) #77 fix preserved
Devil's Advocate counter-evidence accepted: 565f4c2 silently bumped 5 new + 8 existing transitive deps, "26 tests passed" doesn't exercise note-* paths
Branch state still mixed: PageOCRRunner.swift Qwen3-VL/OCRCore refactor is third workstream, must NOT land in refactor: extract NoteCore / NoteToPDF as separate PsychQuant repos (packages 應該要是獨立套件) #78 PR
Root cause 鎖定:NoteParser.swift:154-159 用「strokes.bounds.maxY / pageCount」均分估 pageHeight (bug: .note → pdf 分頁切錯(筆畫橫跨頁邊界、空白不合理分布) #77 context, retained from earlier diagnosis)
Fix 方向:從 documentPaperAttributes.paperSize enum 查 logical pageHeight 替代均分(letter portrait → (583.8, 756))
Issue body 3 個 hypothesis 驗證:Read .claude guidance for upcoming work #1 駁回;feat: AIConfig — AI CLI 工具設定系統 #2 部分;feat: LaTeXNormalizer — 機械式 LaTeX 清理 #3 N/A
Complexity: SDD-warranted → discuss-converged → opt-out 進 implement
三個 packages 全部 v0.1.0 public 獨立 @ PsychQuant/note-{core,to-pdf,to-html}-swift
macdoc refactor/extract-note-packages-78 branch pushed with commit 565f4c2
Scope Changes
(none — 按 diagnosis Strategy 6 phases 嚴格執行)
Blocking
Commits
Repos Created
Problem
macdoc
.gitignoreL20-21 註解寫道:但實際狀態:
.gitsrt-to-html-swiftmd-to-html-swifthtml-to-md-swiftmarker-word-converter-swiftcommon-converter-swiftPsychQuant/common-converter-swiftword-to-md-swiftPsychQuant/word-to-md-swiftnote-core-swiftnote-to-pdf-swiftnote-to-html-swiftnote-core-swift/note-to-pdf-swift/note-to-html-swift既不在白名單、又沒獨立.git、也沒有對應的PsychQuant/*remote repo — 意味著 #76 (note-to-pdf 發布) 的原始碼只存在開發者的 local filesystem,沒納入任何版本控制。Type
refactor
Expected
三個 Note-相關 packages 跟
common-converter-swift/word-to-md-swift同樣處理:獨立成 PsychQuant GitHub repos,用remoteSourceControl依賴。Actual
目前三個 packages 都用 local
path:依賴且完全無版本控制:Source files 只在開發者 local(macdoc v0.5.0 binary 能跑,但無法 collaborate / PR / audit)。
Impact
git log查不到 packages 歷史#77修的 bug 位於packages/note-core-swift/Sources/NoteCore/NoteParser.swift:154-159,已完成實作 + 單元測試,但無法 commit(被.gitignore擋、也沒有 remote repo 可以 push)Strategy
三個 packages 依相依順序處理:
Phase 1 — NoteCore(基礎,無下游內部依賴)
packages/note-core-swift/跑git initPsychQuant/note-core-swiftGitHub repoorigin指到新 repo,push 初版v0.1.0(含 feat: add .note → pdf conversion (complement existing .note → html) #76 已完成的原始碼 + bug: .note → pdf 分頁切錯(筆畫橫跨頁邊界、空白不合理分布) #77 的 fix,如果 bug: .note → pdf 分頁切錯(筆畫橫跨頁邊界、空白不合理分布) #77 也在這個 phase 完成)Package.swift:.package(name: "NoteCore", path: "...")→.package(url: "https://github.com/PsychQuant/note-core-swift.git", from: "0.1.0")note-to-pdf-swift/note-to-html-swift的Package.swift同上swift package update,確認 macdoc build 通過.gitignore裡不需要的!packages/note-core-swift/白名單(如果有加的話)— vacuously satisfied: note packages were never whitelisted, only matched by blanketpackages/rulePhase 2 — NoteToPDF
v0.1.0(含 feat: add .note → pdf conversion (complement existing .note → html) #76 的原始碼)Phase 3 — NoteToHTML
Phase 4 — Verification
swift build應成功拉三個新 repos + build OK — deferred: literal clean-clone blocked by gitignoredpackages/pdf-to-latex-swift+Tests/WordToMDTests(out of refactor: extract NoteCore / NoteToPDF as separate PsychQuant repos (packages 應該要是獨立套件) #78 scope, tracked as refactor: extract pdf-to-latex-swift + ocr-swift to PsychQuant repos; commit Tests/WordToMDTests fixtures (continues #78 pattern) #79)swift test全部通過macdoc convert的 note 相關功能 smoke testBlockers / Dependencies
note-to-pdf-swift已隨 macdoc v0.5.0 發布,獨立後第一個 tag 要用什麼?(建議v0.1.0,因為 package 本身還沒 bump 過)Notes
git add被.gitignore擋,scope-guard 停下來 route 決策note-core-swiftrepo 上Current Status
Phase: closed
Last updated: 2026-04-18 by idd-close
Key Decisions
NoteParser.swift:154-159用「strokes.bounds.maxY / pageCount」均分估 pageHeight (bug: .note → pdf 分頁切錯(筆畫橫跨頁邊界、空白不合理分布) #77 context, retained from earlier diagnosis)documentPaperAttributes.paperSizeenum 查 logical pageHeight 替代均分(letter portrait → (583.8, 756))PsychQuant/note-{core,to-pdf,to-html}-swiftrefactor/extract-note-packages-78branch pushed with commit565f4c2Scope Changes
Blocking
Commits
565f4c2refactor: extract NoteCore/NoteToPDF/NoteToHTML to separate PsychQuant repos (refactor: extract NoteCore / NoteToPDF as separate PsychQuant repos (packages 應該要是獨立套件) #78)60b3bb6chore: bump note-core-swift to 0.1.3 + note-to-pdf-swift to 0.1.2 (bug: .note → pdf 分頁切錯(筆畫橫跨頁邊界、空白不合理分布) #77)Package.resolvedre-pin note-to-pdf-swift back to 0.1.2Repos Created