#!/usr/bin/env node const fs = require('fs'); const os = require('os'); const path = require('path'); const { readFeedbackCsv } = require('./import-feedback-memory'); const { readMemory, applyFeedbackRecordsToMemory } = require('../mcp/src/features/tihao-sourcing/preference-memory'); function main() { const out = fs.mkdtempSync(path.join(os.tmpdir(), 'tihao-feedback-import-')); const csvPath = path.join(out, 'feedback.csv'); const memoryPath = path.join(out, 'memory.json'); fs.writeFileSync(csvPath, [ 'brief编号,平台,博主名称,主页链接,人工复核标签,反馈原因,归因类型,影响范围,是否升级为团队规则,下一轮动作', 'ulike-beauty,小红书,男性泛账号,http://example.com/a,硬性规则违规,脱毛仪不应推男性泛账号,隐性规则,客户品牌级,是,剔除并降权', 'ulike-beauty,小红书,封面下沉账号,http://example.com/b,主页质感不符,封面太下沉不适合精致美容仪,主页证据,个人级,否,降级复核', 'ulike-round2,小红书,男性测评号,http://example.com/c,硬性规则违规,脱毛仪不应推男性泛账号,隐性规则,客户品牌级,是,剔除并降权', 'ulike-round3,抖音,男士生活号,http://example.com/d,硬性规则违规,脱毛仪不应推男性泛账号,隐性规则,客户品牌级,是,剔除并降权' ].join('\n'), 'utf8'); const records = readFeedbackCsv(csvPath); const memory = applyFeedbackRecordsToMemory(readMemory(memoryPath), records); fs.writeFileSync(memoryPath, JSON.stringify(memory, null, 2), 'utf8'); assert(memory.feedbackRecords.length === 4, 'should import feedback records'); assert(memory.blockedCreators.includes('男性泛账号'), 'hard violation creator should be blocked'); assert(memory.teamRuleCandidates.some(item => item.includes('脱毛仪')), 'team rule candidate should be captured'); assert(memory.teamRuleSuggestions.length === 1, 'three similar feedback records should create one team rule suggestion'); assert(memory.teamRuleSuggestions[0].count === 3, 'team rule suggestion should count repeated feedback'); assert(memory.teamRuleSuggestions[0].sources.length === 3, 'team rule suggestion should keep source trace'); assert(memory.personalPreferences.some(item => item.includes('封面太下沉')), 'personal preference should be captured'); assert(memory.feedbackSummary.total === 4, 'summary should count feedback'); assert(memory.feedbackSummary.teamRuleSuggestionCount === 1, 'summary should count team rule suggestions'); console.log(`feedback import smoke ok: ${out}`); } function assert(condition, message) { if (!condition) throw new Error(message); } if (require.main === module) main();