#!/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", "task769-weknora-knowledge-settings-ui-static-smoke"); const RESULT_PATH = path.join(OUTPUT_DIR, "result.json"); const UI_PATH = "rust/crates/mnote-web/browser/sidebar-page-settings-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 assertNotContains(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 ui = read(UI_PATH); for (const forbidden of [ "打开 LightRAG", "相似度阈值", "相关度:", "本地 (Local)", "全局 (Global)", "朴素 (Naive)", "混合模式 (Mix)", "正在读取 LightRAG 状态", "无法连接 LightRAG 服务", ]) { assertNotContains(ui, forbidden, "WeKnora knowledge settings UI"); } for (const required of [ "WeKnora", "WeKnora hybrid", "data-testid=\"mnote-weknora-knowledge-settings-panel\"", "data-knowledge-rag-default-provider=\"weknora\"", "data-knowledge-rag-legacy-fallback-provider=\"lightrag\"", "data-knowledge-rag-source-registry=\"mnote\"", "data-knowledge-rag-provider-index=\"weknora-kb-chunk-index\"", "data-knowledge-rag-active-provider", "data-knowledge-rag-reference-boundary", "data-knowledge-rag-provider=\"weknora\"", "data-knowledge-rag-provider-id", "data-knowledge-rag-provider-ids", "data-knowledge-rag-knowledge-id", "data-knowledge-rag-chunk-count", "data-knowledge-rag-processing-status", "data-knowledge-rag-open-reference-mode", "data-knowledge-rag-delete-local-file-policy=\"preserve-local-file\"", "data-kb-rag-score-label=\"provider-ranking-score\"", "data-kb-rag-score-is-similarity-percent=\"false\"", "provider 排序分", "MNote source registry", "WeKnora KB chunk index", "provider=weknora", "provider ids", "knowledgeId", "chunkCount", "processingStatus", "定位降级", "删除 provider index 与 registry 映射,不删除本地文件", "打开知识库", "Provider 检索策略", "兼容阈值字段保留在请求层,不作为默认主控", ]) { assertContains(ui, required, "WeKnora knowledge settings UI"); } assertOrdered( ui, "(weknora && weknora.dashboardUrl)", "status && (status.dashboardUrl || status.endpoint)", "dashboardUrl 优先级" ); const result = { ok: true, checkedFiles: [UI_PATH], assertions: { noDefaultLightRagCopy: true, noSimilarityThresholdPrimaryControl: true, noRelevancePercentCopy: true, weknoraHybridSearchCopy: true, providerSelectorCoverage: true, sourceRegistrySelectorCoverage: true, processingSelectorCoverage: true, citationOpenReferenceSelectorCoverage: true, providerRankingScoreCopy: true, sourceRegistryBoundaryCopy: true, deleteIndexDoesNotDeleteLocalFileCopy: true, dashboardUrlPriority: true, }, }; fs.writeFileSync(RESULT_PATH, `${JSON.stringify(result, null, 2)}\n`, "utf8"); console.log(JSON.stringify(result, null, 2)); } main();