118 lines
3.8 KiB
JavaScript
118 lines
3.8 KiB
JavaScript
#!/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();
|