| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- #!/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();
|