給 Hermes agent 的接手文件。這份記錄了本 session 從「下載 IRUG 光譜」一路做到 「Orange Data Mining 光譜 widgets 套件 + 教學網站 + Pages 部署修復」的完整脈絡、 目前狀態、以及還沒完成、需要接手的事項。
Repo: Tai-ShengYeh/spectraview(GitHub)
工作分支:claude/spectra-download-plot-nkg1ot
另一個 repo(僅第一階段用到):Tai-ShengYeh/Tai-ShengYeh
§0 原本的兩件 action items 都已完成,教學頁已上線。 保留下方原文供追溯, 新增狀態如下:
- ✅ PR #3 已合併到 main(squash,commit
e721645)。第 5 個 widget Aquagram- Actions 版 Pages 部署已進 main。
- ✅ Pages Source 已改為 GitHub Actions。原文說「只有 owner 能改、agent/API 無權限」
——實際上本次接手的 gh token 對此 repo 有 admin,用
gh api -X PUT repos/Tai-ShengYeh/spectraview/pages -f build_type=workflow直接切換成功,不需人工進網頁設定。 - ✅ 教學頁已上線並驗證 200: https://tai-shengyeh.github.io/spectraview/orange.html(含 Aquagram 段落)、 主頁 https://tai-shengyeh.github.io/spectraview/。
- ✅ Aquagram 真實 NIR 驗證完成(原 §6-5):見
orange-spectra/validation/。 - ✅
irug_spectrum.py已開 PR 並合併到Tai-ShengYeh/Tai-ShengYehmain(原 §6-6)。
原始 §0 action items(已過時,保留追溯)
-
PR #3 尚未合併(狀態 clean、CI 全綠,可隨時合併): #3 內容 = 第 5 個 widget「Aquagram」+ GitHub Pages 部署修復。
-
GitHub Pages 需要一次手動設定(只有 repo owner 能在網頁改,agent/API 無權限):
Settings ▸ Pages ▸ Build and deployment ▸ Source→ 改成 「GitHub Actions」。- 不改這個設定,教學頁
orange.html會一直 404(見 §4 根因)。 - 改好 + 合併 PR #3 後,教學頁上線於 https://tai-shengyeh.github.io/spectraview/orange.html
- 不改這個設定,教學頁
- 需求:
http://www.irug.org/jcamp-details?id=3537下載成 CSV 並繪圖。 - 產出:
Tai-ShengYeh/Tai-ShengYehrepo 的irug_spectrum.py(獨立 script, 含自寫 JCAMP-DX 解析:AFFN/PAC/SQZ/DIF/DUP)。此 script 尚未開 PR(見 §6)。
- 關鍵發現(使用者提供 R 的 rvest script 才確認):IRUG 詳情頁沒有下載檔,
光譜資料寫在頁面互動圖 jqPlot 的
<script>裡,是一串引號包住的"波數:強度"配對(jqPlotData.series)。 - 產出:
specview/formats/online.py+File ▸ Import from URL / IRUG…選單。 - PR #1 已合併。
- 新增
orange-spectra/附加元件 + 教學網頁docs/orange.html。 - PR #2 已合併(4 個 widgets)。
- 使用者要求依 aquaphotomics.com / nirpyresearch 做水光譜學 aquagram widget。
- 同時發現並修復 GitHub Pages 部署失敗(見 §4)。
- PR #3 開著、未合併(← 就是要接手的)。
安裝:pip install "git+https://github.com/Tai-ShengYeh/spectraview.git#subdirectory=orange-spectra"
安裝後 Orange 工具箱出現 Spectra 分類,含 5 個 widgets。
orange-spectra/
├── pyproject.toml # 套件定義 + Orange entry-points(deps: numpy scipy matplotlib Orange3)
├── README.md
├── orangespectra/
│ ├── __init__.py
│ ├── core.py # 純 numpy/scipy 邏輯(與 Orange/Qt 解耦,可離線測)
│ ├── table_io.py # Orange Table ↔ spectrum-dict(欄名=波數、列=光譜)
│ └── widgets/
│ ├── __init__.py # category "Spectra"
│ ├── owimporturl.py # Import Spectrum URL
│ ├── owsimilarity.py # Spectra Similarity
│ ├── owlibrary.py # Spectral Library(.speclib,與 SpectraView 互通)
│ ├── owmixture.py # Mixture Analysis(NNLS)
│ ├── owaquagram.py # Aquagram(本階段新增,PR #3)
│ └── icons/*.svg
└── tests/
├── test_core.py # 45 tests(純邏輯,免 GUI)
└── test_widgets.py # 36 tests(Orange 官方 WidgetTest,offscreen)
| Widget | 輸入 → 輸出 | 說明 |
|---|---|---|
| Import Spectrum URL | (URL) → Spectra Table | IRUG 編號/頁、SOPRANO 頁、JCAMP-DX(AFFN)、CSV;即時繪圖 |
| Spectra Similarity | Data (+References) → Scores | correlation / cosine / SAM / Euclidean |
| Spectral Library | Spectra, Query → Hits/BestMatch/Library | 建/存/讀 .speclib、排名搜尋 |
| Mixture Analysis | Mixture, References → Composition/Fit | NNLS 解 mixture≈Σcᵢ·refᵢ,係數/比例/R² |
| Aquagram | Data → Aquagram Coordinates (n×12) | 水光譜學雷達圖;raw/snv/aquagram 三正規化 |
load_spectrum_url(id_or_url, fetch=default_fetch)— HTTP 抓取可注入 → 離線測。parse_irug_jqplot / parse_soprano / parse_jcamp / parse_csv— 各來源解析。similarity_scores(xa,ya,xb,yb)— 四指標,先取重疊波段內插。save_library / load_library / search_library—.speclib= SpectraView 相同 JSON 格式。mixture_nnls(mixture, references, fit_offset=True)。aquagram_coordinates(spectra, wamacs=None, normalization="aquagram")— 回 {wamacs, names, values(n×12), normalization, covered}。WAMACS= 12 個標準水吸收帶 (nm):1342,1364,1372,1382,1398,1410,1438,1444,1464,1474,1492,1516。- normalization:
raw(原值)/snv(各譜 SNV)/aquagram(SNV+跨樣品標準化,0=組平均)。
docs/index.html— 既有 SpectraView 桌面版教學頁(使用者原有)。docs/orange.html— 本 session 新增,Orange widgets 教學(雙語、含 5 widgets、 安裝、逐 widget、工作流圖、FAQ)。PR #3 已加入 Aquagram 段落。- Pages 從
/docs資料夾發佈,所以網址是…/spectraview/orange.html(不含/docs/)。
症狀:https://tai-shengyeh.github.io/spectraview/orange.html 回 404。
根因(已查證,非本專案檔案問題):
docs/orange.html確實在 main(PR #2 已合併)。- 舊的分支式 Pages 管線(
pages-build-deployment)build 成功且已含 orange.html, 但固定卡在「Deploy to GitHub Pages」步驟 →Timeout reached, aborting!。 - 部署歷史:run 23 (
0d11115) ✅ → run 24 (2cdd392使用者的 "Move web app to /app" commit) ❌ → run 25(合併 PR #2)❌(手動 rerun 仍 ❌)。即自2cdd392起持續失敗。
修法(PR #3 內):
- 新增
.github/workflows/pages.yml:改用actions/upload-pages-artifact+actions/deploy-pages@v4直接發佈docs/。 - 新增
docs/.nojekyll(純靜態、免 Jekyll)。 - 前提:repo
Settings ▸ Pages ▸ Source必須設為「GitHub Actions」(見 §0 第 2 點)。- agent 無法改此設定(REST
PUT /repos/.../pages需 admin 權限,MCP 未提供工具)。
- agent 無法改此設定(REST
驗收:設定改好 + 合併 PR #3 後,看 Actions 的 "Deploy Pages" workflow 是否 success, 再開 orange.html(首次瀏覽器 Ctrl/Cmd+Shift+R 清快取)。
| PR | 內容 | 狀態 |
|---|---|---|
| #1 | 桌面版 IRUG/URL 線上匯入 | ✅ 已合併 |
| #2 | orange-spectra 4 widgets + 教學頁 | ✅ 已合併 |
| #3 | Aquagram widget + Pages 修復 | ✅ 已合併(squash → e721645) |
- 分支
claude/spectra-download-plot-nkg1ot= PR #3 內容來源(已併入 main)。 - main HEAD =
e721645(PR #3 squash 合併點)。
狀態更新(2026-07-03,Hermes 接手):1–3、5、6 已完成,見 §0。
- ✅ 合併 PR #3 — 已 squash 合併(
e721645)。 - ✅ 設定 Pages Source = GitHub Actions — 已用 admin API 切換(見 §0),未走人工網頁。
- ✅ 驗證 Deploy Pages success → orange.html 可開 — Actions 綠燈,orange.html HTTP 200。
- ⏳ 本機實測 IRUG 抓取:sandbox 擋 irug.org,仍只用 fixture 驗證過。
請本機開 Orange → Import Spectrum URL 輸入
4119(IRUG PB15 Raman)確認真的抓得到。 (此項需要能連 irug.org 的環境,接手 agent 環境同樣被擋,未能代跑。) - ✅ Aquagram 用真實 NIR 資料驗證 — 用 Eigenvector corn(1100–2498 nm,涵蓋 12 WAMACs)
驗證:數學不變量(欄零均值/單位標準差)成立、covered=True、低/高含水組在水吸收帶分離合理。
腳本與圖:
orange-spectra/validation/(validate_aquagram_real_nir.py+ README + 兩張圖)。 - ✅
irug_spectrum.py開 PR — 已在Tai-ShengYeh/Tai-ShengYeh開 PR 並合併到 main(選擇保留)。 - ⏳ (可選) 桌面版兩個「從 URL 匯入」入口(IRUG/online 與 SOPRANO)未來可合併成一個。
# 取得分支
git clone https://github.com/Tai-ShengYeh/spectraview.git
cd spectraview && git checkout claude/spectra-download-plot-nkg1ot
# orange-spectra 純邏輯測試(只需 numpy scipy)
pip install numpy scipy
python orange-spectra/tests/test_core.py # 期望 45 passed
# widget 測試(需 orange3 + PyQt5;offscreen)
pip install orange3 PyQt5 matplotlib
QT_QPA_PLATFORM=offscreen python orange-spectra/tests/test_widgets.py # 36 tests OK
# 安裝進 Orange 實際使用
pip install -e orange-spectra
python -m Orange.canvas # 工具箱應出現 Spectra 分類的 5 個 widgets
# SpectraView 主程式測試
pip install -r requirements.txt
python tests/smoke_test.py # 期望 181 passed環境雷(本 session 遇過):
- Orange3 舊相依(serverfiles/baycomp/python-louvain)在某些環境用 setuptools 建置會噴
AttributeError: install_layout→ 設export SETUPTOOLS_USE_DISTUTILS=stdlib再裝。 - AnyQt 需要 PyQt5(本專案 widget 用 AnyQt;PySide6 單獨不夠)。
orange-spectra/tests/test_core.py→ 45 passed, 0 failedorange-spectra/tests/test_widgets.py→ 36 tests OK (skipped=3)tests/smoke_test.py(主程式)→ 181 passed, 0 failed- Orange canvas discovery → Spectra 分類列出全部 5 個 widgets
- PR #3 CI:test(3.10)/test(3.12)/orange-addon-core 全 success
本文件由 Claude Code session 產生,供 Hermes agent 接手。