feat(t213): 匯出診斷檔搬進 arcrun-app 本機端(phase 2,接手 t210 落地後的 Progress/FailureBreakdown)
t210(commit 5effcb2)已把「總量進度」「失敗分類」算好並寫進 status.json(現況快照,
不隨閒置歸零)——本次直接讀那兩個欄位,不另算一套(首頁與診斷檔同一組數字)。
新增:
- collector/cmd/arcrun-app/diagnostics_export.go
- App.ExportDiagnostics():合併本機(daemon 版本/自我更新狀態/Progress/
FailureBreakdown/略過檔案樣本)與雲端(每帳號打新端點 GET /portal/daemon/diagnostics,
X-Arcrun-API-Key 認證)成一份 JSON,彈系統存檔對話框存下來
- mergeDiagnostics 抽成無 IO 純函式,方便測試
- collector/cmd/arcrun-app/diagnostics_export_test.go:5 個離線測試,涵蓋
同首頁數字/分類名稱原樣照抄不自己判斷/失敗檔名 basename-only/略過清單省略欄位/
帳號層 cloud 與 cloud_error 互斥
- frontend/src/main.js:「版本與更新」頁加「疑難排解」卡片+匯出按鈕
守住的規則:
- Progress/FailureBreakdown 原樣接住 status.json,不重掃 manifest
- 分類名稱字串只認 collector/progress.go 的 ClassifyFailure,本檔不判斷任何分類
- 失敗檔名 basename-only:借用既有 buildSkipped() 輸出(本來就是 basename+白話標籤)
驗證(實跑,非設計稿):go build/vet/gofmt 全乾淨;go test ./...(collector+
arcrun-app)全過;check-cis.sh/check-render.sh 視覺機械閘全過;wails build 成功
產生含 ExportDiagnostics 的 bindings;拿本機真實 config.json(2 個真帳號)+真網路
跑 buildDiagnosticsPayload():真拿到 update_check.latest=v0.18.23、真列出本機
略過檔案(basename)、兩個真帳號誠實回 cloud_error(線上新端點還沒部署,與總管
實測結果一致)。未在真實 GUI 點過按鈕(本機正跑 production Arcrun.app,避免干擾)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -232,6 +232,21 @@ function pageUpdate(s) {
|
||||
<h3>需要協助?</h3>
|
||||
<div class="d">安裝、更新、把知識庫接到你的 AI,說明文件都寫在這裡。</div>
|
||||
<div class="acts"><button id="uDocs">開啟使用說明</button></div>
|
||||
</div>
|
||||
${cardDiagnostics()}`;
|
||||
}
|
||||
|
||||
// 疑難排解/匯出診斷檔(t213,2026-08-08):leo 直接指令「一顆按鈕下載一個檔案,
|
||||
// 把檔案發給我」——這裡是那顆按鈕真正住的地方(不是雲端 portal 網頁,那邊碰不到
|
||||
// 這台電腦上的資料)。按下去在**這台電腦**上合併本機統計+雲端統計成一份 JSON,
|
||||
// 彈系統存檔對話框讓你選位置存。只有數字/狀態,不含你的任何文件內容。
|
||||
function cardDiagnostics() {
|
||||
return `
|
||||
<div class="card">
|
||||
<h3>疑難排解</h3>
|
||||
<div class="d">搜尋或同步有問題時,可以匯出一份診斷檔給我們,幫你更快找到問題(只有統計數字,不含你的任何文件內容)。</div>
|
||||
<div class="acts"><button id="uDiag">匯出診斷檔</button></div>
|
||||
<div class="d" id="uDiagStatus" style="margin-top:8px"></div>
|
||||
</div>`;
|
||||
}
|
||||
|
||||
@@ -273,6 +288,7 @@ function wire() {
|
||||
on('obInstall', () => go.OpenURL('https://install.arcrun.dev/'));
|
||||
on('aiSave', saveAI);
|
||||
on('uCheck', checkUpdate); on('uDownload', downloadUpdate); on('uApply', applyUpdate);
|
||||
on('uDiag', exportDiagnostics);
|
||||
document.querySelectorAll('[data-portal]').forEach((b) => { b.onclick = () => go.OpenURL(b.dataset.portal); });
|
||||
document.querySelectorAll('[data-openurl]').forEach((b) => { b.onclick = () => go.OpenURL(b.dataset.openurl); });
|
||||
document.querySelectorAll('[data-addto]').forEach((b) => { b.onclick = () => addFolder(Number(b.dataset.addto)); });
|
||||
@@ -364,5 +380,18 @@ async function applyUpdate() {
|
||||
try { await go.ApplyUpdate(); } catch (ex) { updateInfo = { err: String(ex) }; renderPage(); }
|
||||
}
|
||||
|
||||
// 匯出診斷檔(t213):後端 ExportDiagnostics 自己彈系統存檔對話框;回傳空字串=
|
||||
// 使用者按了取消,不算錯誤、不顯示紅字。
|
||||
async function exportDiagnostics() {
|
||||
const el = $('uDiagStatus');
|
||||
if (el) el.textContent = '匯出中…';
|
||||
try {
|
||||
const path = await go.ExportDiagnostics();
|
||||
if (el) el.textContent = path ? `已存到:${path}` : '已取消。';
|
||||
} catch (ex) {
|
||||
if (el) el.textContent = '匯出失敗:' + String(ex);
|
||||
}
|
||||
}
|
||||
|
||||
tick();
|
||||
setInterval(tick, 1000);
|
||||
|
||||
Reference in New Issue
Block a user