const assert=require('node:assert/strict'),fs=require('node:fs'),path=require('node:path'); const root=path.resolve(__dirname,'..'),read=f=>fs.readFileSync(path.join(root,f),'utf8'); const library=read('src/components/xingbang/LeaseLibraryWorkbench.tsx'),pool=read('src/components/xingbang/KnowledgePools.tsx'); for(const label of ['条件筛选','自然语言','只读 SQL','预览筛选结果','确认加工范围','提炼 Skills','提炼 Rules'])assert.ok(library.includes(label),label); for(const api of ['/library/cases','/library/queries','/library/selections','/library/extractions'])assert.ok(library.includes(api),api); assert.ok(library.includes('case_ids'));assert.ok(library.includes('seq.current'));assert.ok(library.includes('setSelection(null)')); assert.ok(pool.includes('webkitdirectory'));assert.ok(pool.includes('encodeFiles'));assert.ok(pool.includes('/library/skills/import'));assert.ok(pool.includes('history_derived')); assert.ok(pool.includes('card.edited_by!==identity?.id'));assert.ok(pool.includes('card.evaluation?.passed')); const folder=read('src/components/xingbang/SkillPackageDialog.tsx');assert.ok(folder.includes('showModal()'));assert.ok(folder.includes('SKILL.md'));assert.ok(folder.includes('/package'));assert.ok(folder.includes('/open'));assert.ok(folder.includes('downloadSkill')); const identity=read('src/components/xingbang/IdentitySelector.tsx');assert.ok(!identity.includes('