#!/usr/bin/env node "use strict"; const assert = require("node:assert"); const fs = require("node:fs"); const path = require("node:path"); const ROOT = process.cwd(); const OUTPUT_DIR = path.join(ROOT, "tmp", "task783-weknora-kb-settings-ui-static-smoke"); const RESULT_PATH = path.join(OUTPUT_DIR, "result.json"); const SETTINGS_RUNTIME = "rust/crates/mnote-web/browser/sidebar-page-settings-runtime.js"; const SIDEBAR_RUNTIME = "rust/crates/mnote-web/browser/sidebar-tree-runtime.js"; function read(relativePath) { return fs.readFileSync(path.join(ROOT, relativePath), "utf8"); } function assertContains(content, needle, label) { assert(content.includes(needle), `${label} 缺少: ${needle}`); } function assertOrdered(content, first, second, label) { const firstIndex = content.indexOf(first); const secondIndex = content.indexOf(second); assert(firstIndex >= 0, `${label} 缺少: ${first}`); assert(secondIndex >= 0, `${label} 缺少: ${second}`); assert(firstIndex < secondIndex, `${label} 顺序错误: ${first} 应早于 ${second}`); } function main() { fs.mkdirSync(OUTPUT_DIR, { recursive: true }); const settings = read(SETTINGS_RUNTIME); const sidebar = read(SIDEBAR_RUNTIME); for (const required of [ "data-mnote-weknora-page-replacement=\"true\"", "mnote-weknora-kb-page", "data-testid=\"mnote-weknora-kb-list-pane\"", "data-testid=\"mnote-weknora-kb-card-list\"", "data-knowledge-rag-action=\"select-kb\"", "data-testid=\"mnote-weknora-kb-detail-pane\"", "data-testid=\"mnote-weknora-kb-detail-hero\"", "data-weknora-document-list-view=\"true\"", "知识库列表", "创建知识库", "上传/索引到 WeKnora", "data-testid=\"mnote-weknora-kb-summary\"", "data-knowledge-rag-kb-provider=\"weknora\"", "data-knowledge-rag-kb-id", "data-knowledge-rag-kb-ids", "data-knowledge-rag-processing-count", "data-knowledge-rag-source-picker=\"mnote-filetree\"", "data-knowledge-rag-source-kind=\"local-file-or-folder\"", "本地文件或文件夹,例如 docs/book.pdf / docs", "providerKnowledgeBaseId", "providerKnowledgeId", "provider_mapped", "data-knowledge-rag-kb-id", "data-knowledge-rag-chunk-id", "data-kb-rag-search-result=\"true\"", "data-knowledge-rag-action=\"open-source-reference\"", "data-knowledge-rag-open-reference-mode=\"search-result-open-reference\"", "data-mnote-knowledge-rag-open-reference-mode", "source-registry-reference", "openPrimaryDocument", "resourcePath", "删除 provider index 与 registry 映射,不删除本地文件", ]) { assertContains(settings, required, SETTINGS_RUNTIME); } assertContains(sidebar, "openKnowledgeRagSourceReference", SIDEBAR_RUNTIME); assertContains(sidebar, "knowledgeRagActionName === 'open-source-reference'", SIDEBAR_RUNTIME); assertContains(sidebar, "knowledgeRagActionName === 'select-kb'", SIDEBAR_RUNTIME); assertContains(sidebar, "knowledgeRagActionName === 'focus-create-kb'", SIDEBAR_RUNTIME); assertOrdered( settings, "knowledgeRagKbSummaryHtml(status, entries, providerDocs)", "
Provider", "KB summary 应显示在 provider 详情前", ); assertOrdered( settings, "data-knowledge-rag-action=\"open-source-reference\"", "data-knowledge-rag-action=\"delete-source\"", "source row 应先提供打开引用,再提供删除索引", ); const result = { ok: true, checkedFiles: [SETTINGS_RUNTIME, SIDEBAR_RUNTIME], assertions: { kbSummaryVisible: true, weknoraPageReplacementVisible: true, weknoraKbListPaneVisible: true, weknoraKbDetailPaneVisible: true, weknoraDocumentListViewVisible: true, fileTreePickerBoundary: true, processingStateVisible: true, searchResultOpenReference: true, sourceRowOpenReference: true, deletePreservesLocalFileCopy: true, noBackendKnowledgeRagEditRequired: true, }, }; fs.writeFileSync(RESULT_PATH, `${JSON.stringify(result, null, 2)}\n`, "utf8"); console.log(JSON.stringify(result, null, 2)); } main();