v0.18.17:失敗的檔案列出檔名與原因;補上「上一版說有、其實沒做進畫面」的按鈕

leo Windows 實測 v0.18.16:連線誤報已消失( 那個修正生效),
但出現「⚠ 3 份失敗」→ 加檔後「⚠ 1 份失敗」,兩個新檔沒推上雲端也沒產卡。

## 修:數字不能代替原因(今天第四次同款病)
collector **早就**把「哪個檔失敗、為什麼」寫進 status.json(`Failures[]`),
但 App 一直只讀計數 ⇒ 畫面只會說「⚠ 3 份失敗」
⇒ leo 只能回報「沒推到雲端」,我只能猜。
前三次同款:exit status 2 蓋掉真話/非文件檔不點名/誤判沒連線。
現在列出檔名+原因(最多 8 份,總數照實講)。

## 🔴 更正:v0.18.12 宣稱的「一鍵打開紀錄檔資料夾」**根本沒進到畫面**
Go 那邊 `OpenLogFolder()`/`EngineTrouble` 都做了,但前端那次 `str.replace()`
**錨點縮排不符、沒命中**,而我沒加斷言 ⇒ 檔案沒變,我卻在回覆與 changelog 裡宣稱做好了。
(同一天已經因為「取代沒驗證」出過一次事,這是第二次。)
本次三處錨點**全部 assert**,並機械複驗五個關鍵字+`node --check`。
changelog 也已更正 v0.18.12 那段。

## 順帶修 .bat 的收集段(leo:「有按照 1 然後 2,你要檢查 bat」)
收集 log 那段用 `>nul 2>&1` **把錯誤全吞掉** ⇒ 失敗了也沒人知道,
我還以為是 leo 沒按 Enter。改成**逐檔回報 v/X/-**,並把輸出目錄
從中文「記錄檔」改成純英文 `logs`(中文路徑+UNC+Big5 主控台三者疊加容易出事)。
This commit is contained in:
2026-08-06 20:22:24 +08:00
parent 01fbb21357
commit 9dc7cbc803
3 changed files with 97 additions and 6 deletions
+39
View File
@@ -72,6 +72,8 @@ function pageHome(s) {
</div>`).join('')}
</div>
</div>
${cardTrouble(s)}
${cardFailures(s.failures)}
${cardSkipped(s.skipped)}
<div class="card">
<h3>總計</h3>
@@ -89,6 +91,42 @@ function pageHome(s) {
// 使用者只能得到「我丟了檔,然後什麼都沒發生」這個結論。
// 這張卡就是那句話該出現的地方——**首頁**,他每次打開 App 一定會看到。
// 沒有東西被略過時後端回 null ⇒ 這裡回空字串,畫面保持乾淨(沒事不佔版面)。
// 引擎有問題時才長出來:一鍵打開紀錄檔資料夾。
// leo 2026-08-06:「不能用一個 debug mode?」——log 一直都在寫,缺的是入口。
function cardTrouble(s) {
if (!s.engineTrouble) return '';
return `
<div class="card">
<h3>需要回報這個問題?</h3>
<div class="d">
詳細的錯誤紀錄已經自動存在你電腦裡,不必開啟任何設定。<br/>
把 <b>collector.log</b> 和 <b>app.log</b> 傳給我們就能查。
</div>
<div class="d" style="margin-top:6px;opacity:.7">${esc(s.logFolder || '')}</div>
<div class="acts"><button id="hLogs">打開紀錄檔資料夾</button></div>
</div>`;
}
// 失敗的檔案:列出**檔名與原因**。
// leo 2026-08-06 實測:畫面只寫「⚠ 3 份失敗」,他只能回報「沒推到雲端」,
// 而原因本來就在 status.json 裡 —— 數字不能代替原因。
function cardFailures(f) {
if (!f || !f.items || !f.items.length) return '';
return `
<div class="card">
<h3>${esc(f.title)}</h3>
<div class="d">${esc(f.note)}</div>
<div class="steps" style="margin-top:10px">
${f.items.map((it) => `
<div class="step">
<span class="t">${esc(it.name)}</span>
<span class="m">${esc(it.reason)}</span>
</div>`).join('')}
</div>
${f.more > 0 ? `<div class="d" style="margin-top:8px">…還有 ${f.more} 份</div>` : ''}
</div>`;
}
function cardSkipped(k) {
if (!k) return '';
return `
@@ -214,6 +252,7 @@ function wire() {
const on = (id, fn) => { const e = $(id); if (e) e.onclick = fn; };
on('uDocs', () => go.OpenURL('https://rag.arcrun.dev/docs/'));
on('hLogs', () => go.OpenLogFolder());
on('hLogs', () => go.OpenLogFolder());
on('hAcct', showConnect); on('obConnect', showConnect);
on('obInstall', () => go.OpenURL('https://install.arcrun.dev/'));
on('aiSave', saveAI);