feat(账号分析+工作台): 功能三自动联动生成设定卡+双向联动维护+玫瑰金配色定稿+首页数据预览/周榜优化+CDP验证脚本

- mcn-dou-analysis: 功能三产出设定后自动生成设定卡(Step7); 设定md与卡片SVG双向联动维护规则固化(06文档+03文档+SKILL.md); 浅色系配色定稿玫瑰金(#D6A3A9→#9A5563)+背景文字提亮规则; 新增06生成账号设定卡片文档+模板样例
- mcn-work-shop: 首页数据预览条/周榜预览表加宽/改名AI脚本诊断/tab切换/添加账号弹窗等优化
- 新增 cdp-*.mjs 验证脚本14个(可复用); .gitignore 忽略运行日志/截图/tmp
This commit is contained in:
maogeigei committed 2026-08-31 15:27:54 +08:00
1 parent ab97842030
commit 268ce29aae
35 files changed
+2567 -117

No files matched your search

@@ -0,0 +1,56 @@
// 验证「账号周榜」5 个数值列加宽(.th-wide min-width:110px)
// 只读测量,零副作用
const list = await fetch('http://localhost:9223/json').then((r) => r.json());
let page = list.find((t) => t.type === 'page' && t.url.includes('#/ranking'));
if (!page) page = list.find((t) => t.type === 'page' && t.url.includes('localhost:8899'));
if (!page) { console.log('ERR: no workbuddy page open'); process.exit(1); }
const ws = new WebSocket(page.webSocketDebuggerUrl);
let id = 0; const pending = new Map();
const send = (method, params = {}) => new Promise((res, rej) => { const i = ++id; pending.set(i, { res, rej }); ws.send(JSON.stringify({ id: i, method, params })); });
ws.onmessage = (e) => { const m = JSON.parse(e.data); if (m.id && pending.has(m.id)) { const p = pending.get(m.id); pending.delete(m.id); m.error ? p.rej(new Error(m.error.message)) : p.res(m.result); } };
await new Promise((r) => (ws.onopen = r));
const ev = async (expr) => { const r = await send('Runtime.evaluate', { expression: expr, returnByValue: true, awaitPromise: true }); if (r.exceptionDetails) return { __err: (r.exceptionDetails.exception?.description || r.exceptionDetails.text).slice(0, 300) }; return r.result.value; };
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
await send('Page.enable'); await send('Runtime.enable');
// 1) 导航到周榜页(若不在)并刷新加载最新 CSS
if (!page.url.includes('#/ranking')) {
await send('Page.navigate', { url: 'http://localhost:8899/#/ranking' });
await sleep(2000);
}
await send('Page.reload', { ignoreCache: true });
await sleep(3000);
// 2) 测量表头各列宽度
const cols = await ev(`(() => {
const ths = [...document.querySelectorAll('.table th')];
const wideKeys = ['comprehensiveScore', 'newFans', 'newLikes', 'newComments', 'newShares'];
const rowCount = document.querySelectorAll('.table tbody tr').length;
const result = ths.map((th) => {
const rect = th.getBoundingClientRect();
return { key: th.dataset.sort || '', label: th.textContent.trim().slice(0, 8), wide: th.classList.contains('th-wide'), w: Math.round(rect.width) };
});
return { rowCount, result };
})()`);
console.log('行数:', cols.rowCount);
console.log('表头列宽:');
for (const c of cols.result) {
const mark = c.wide ? ' [th-wide]' : '';
const match = c.wide ? (c.w >= 110 ? ' >=110 ✓' : ' <110 ✗') : '';
console.log(' ' + (c.key || c.label).padEnd(22) + ' width=' + String(c.w).padStart(4) + mark + match);
}
const wideCols = cols.result.filter((c) => c.wide);
const allOk = wideCols.length === 5 && wideCols.every((c) => c.w >= 110);
// 3) 记录 CSS 规则是否生效
const cssCheck = await ev(`(() => {
const sheet = [...document.styleSheets].map((s) => s.href || 'inline').join(',');
const th = document.querySelector('.table th.th-wide');
const cs = th ? getComputedStyle(th) : null;
return { sheet, minWidth: cs ? cs.minWidth : 'n/a' };
})()`);
console.log('样式源:', cssCheck.sheet.slice(0, 160));
console.log('computed min-width:', cssCheck.minWidth);
ws.close();
console.log(allOk ? 'PASS: 5 列均已加宽(>=110px)' : 'CHECK: 存在未达标的列');