feedback-import-smoke.js 2.6 KB

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