import fs from 'node:fs'; const platformFiles = [ 'server/src/automation/platforms/xiaohongshu.ts', 'server/src/automation/platforms/weixin.ts', 'server/src/automation/platforms/baijiahao.ts', 'server/src/automation/platforms/douyin.ts', 'server/src/automation/platforms/bilibili.ts', 'server/src/automation/platforms/kuaishou.ts', ]; const lifecycleOffenders = []; for (const file of platformFiles) { const lines = fs.readFileSync(file, 'utf8').split(/\r?\n/); for (let index = 0; index < lines.length; index += 1) { if (!lines[index].includes('await this.closeBrowser()')) continue; const followingLines = lines.slice(index + 1, index + 5).join('\n'); if (followingLines.includes('this.page.url()')) { lifecycleOffenders.push(`${file}:${index + 1}`); } } } if (lifecycleOffenders.length > 0) { throw new Error( `publish success reads this.page.url() after closeBrowser():\n${lifecycleOffenders.join('\n')}`, ); } const publishService = fs.readFileSync('server/src/services/PublishService.ts', 'utf8'); if (publishService.includes('private adapters: Map = new Map();')) { throw new Error('PublishService stores shared adapter instances; publish adapters must be created per run.'); } const baijiahaoAdapter = fs.readFileSync('server/src/automation/platforms/baijiahao.ts', 'utf8'); if (/const publishBtn = this\.page\.locator[\s\S]{0,300}await publishBtn\.click\(\);/.test(baijiahaoAdapter)) { throw new Error('Baijiahao publish button uses a plain click without overlay fallback.'); } console.log('publish flow checks passed');