feat(MCN工作台): 数据功能页+图标扁平化+多项UI优化

- 工作台大版本升级:hash 路由 + 6 数据功能页(周榜/热门账号/账号详情/视频详情/AI写脚本/AI写作复盘),只读复用 dsh 库副本 + 抖音榜单 JSON
- 数据库隔离:复制 dsh 库到 mcn-work-shop/,与 dsh 原库各访问各的(已 gitignore)
- 图标全面扁平化:Lucide 线性 SVG,功能图标亮色区分,文字标题去图标
- 首页重构:功能入口卡 + AI写剧本快捷卡片(2列/8个/5行预览) + 独立帮助页 + header 精简
- 新增设计技能 impeccable + taste-skill(生成网页时参考)
- 修复:fmtTime 跨 script 全局冲突(P0)、弹窗关闭、外链新标签打开等
This commit is contained in:
maogeigei committed 2026-08-27 12:33:57 +08:00
1 parent e1dc14e8a3
commit d3f98dda77
120 files changed
+44528 -1

No files matched your search

+79
View File
@@ -47,3 +47,82 @@
- **名称纠正(10:19 用户反馈)**:`list_hot_accounts`/`hot_account_detail` **不是热门账号/榜单**,是 **MCN 内部账号库**(内部维护的达人账号,含人设/赛道/标签/代表作,非抖音页面实时数据;工具命名 hot_accounts 有误导性)——6 处文案已改「内部账号库查询」,验证「热门账号榜单/列表/详情」零残留 ✅、源/dsh 一致 ✅
- **验证**:三处新增源/dsh diff 一致 ✅(MCP 规范两侧完全一致)
- **三层化沉淀**:失误与规避记录 #013(已含内部账号库纠正)+ 本日志
## 10:25 同步到远程仓库
- 提交 f025ad3(13M/3R/1A):mcn-dou-analysis 内嵌副本结构整合——references-add/ 的路径配置.md+铁律避坑规则2文件迁入 references/(git 识别为 rename),五功能文件/SKILL.md/MCP规范/excel_tool.py/select_top6.py 同步更新,记忆+失误记录
- push 成功,browser-harness 未再误入(.gitignore 条目生效);origin/main = 本地 HEAD = f025ad3,工作区 0 改动;跟踪引用照旧重建
## 10:30-11:00 MCN工作台开发(V1.0 本地 Web 入口)
- **用户需求**:在 `project/短视频脚本创作/V1.0/mcn-work-shop/` 开发工作台,方便使用技能 + 查看生成内容;形态=**本地 Web 服务**(非静态页);产出默认读桌面 MCNSkill项目 + 支持手动配置;挂成技能(说「打开工作台」自动拉起);**不同步 dsh**
- **实现**:server.js 零依赖 Node(http/fs/path 原生,端口8899占用自动+1)+ public/ 三件套(index.html/style.css/app.js 零 CDN)+ start.bat(managed node 优先回退系统 node)
- API:/api/roots(默认+自定义根)/api/tree(递归目录树,深度≤4,跳隐藏/权限/占用)/api/read(md/json/txt/csv 在线预览,>5MB 拒绝)/api/download;路径白名单防穿越(默认根+自定义根,403 拦截)
- 前端:🧭技能导航(5大功能块+典型问法+三种创作模式,数据对齐帮助文档)+📁产出浏览(账号树折叠/搜索过滤/迷你 markdown 渲染器/json 格式化/xlsx 下载提示/设置弹窗 localStorage 记忆根目录)
- **验证全过**:静态页 2744B+12983B+8573B、tree 5 账号中文路径正常、read md/json 正常、越权 403、xlsx 415 提示下载、download 正常
- **技能挂载(仅 V1.0)**:SKILL.md 新增「MCN工作台」章节(触发语+启动步骤+两页签说明+不同步声明),last_change 更新;帮助文档开头补「打开工作台」提示行;**dsh/Lite 均未改**(用户明确,属刻意 divergence)
- **边界**:工作台是入口+查看器,技能执行仍在 WorkBuddy 对话(无网页→agent API);xlsx 暂不支持在线预览(零依赖取舍),后续可加服务端解析
## 工作台修复:文案更名 + 弹窗关闭失效(10:40)
- **用户反馈 2 条**:①「产出目录设置」改为「项目地址设置」②点击关闭按钮无法关闭弹窗
- **修复**:
- 文案统一「产出目录」→「项目地址」(index.html 5 处:设置按钮 title/下拉 title/弹窗标题/说明/placeholder;app.js 错误提示;server.js 启动日志;SKILL.md 工作台章节),仅 V1.0,dsh/Lite 不动
- **弹窗关闭失效根因**:`.modal-mask{display:flex}` 作者样式优先级覆盖 `hidden` 属性 UA 默认 `display:none`,`hidden=true` 不生效 → style.css 补 `.modal-mask[hidden]{display:none}`(同优先级后声明胜出)
- server.js 静态响应补 `Cache-Control: no-store`(否则浏览器缓存旧 css/js);之前一次 Edit 因缩进不匹配静默未生效,复查 grep 发现后重改
- **验证**:重启服务(8899,注意小米 MiPCAudio 也占 0.0.0.0:8899 但工作台用 127.0.0.1 互不冲突);curl 核验 api/静态 200、修复规则与文案已上线、响应头 no-store ✅;SKILL.md last_change 更新
- **遗留**:browser-harness 技能环境未安装(仅 SKILL.md),无法浏览器实测,用户刷新页面确认
## 工作台问法复制功能(10:44)
- **用户问**:能否点工作台功能按钮后 AI 会话自动处理?**查证结论**:不能——工作台功能卡是静态说明,WorkBuddy 无「网页/本地 HTTP → 触发会话」官方接口;触发入口仅对话框人工发话 + 官方「远程遥控」IM 机器人(企微/QQ/飞书/钉钉,Claw 设置);第三方博客的 URL scheme/本地 HTTP 方案无官方确认不可靠
- **用户选定**:功能卡改「点一下复制问法 → 粘贴对话执行」(AskUserQuestion 3 选 1)
- **实现**:qa-row 加 copyable + data-q + title;事件委托点击复制(去外层引号);navigator.clipboard.writeText + execCommand 兜底;toast 提示「已复制」1.8s;intro 提示行「点击任意问法即可复制」;CSS hover 高亮 + 📋 图标
- **验证**:curl 核验 app.js 8 处 / index.html 1 处 / style.css 5 处改动已上线 ✅;SKILL.md 工作台章节+last_change 更新;仅 V1.0 不同步 dsh/Lite
## dsh 插件页面盘点(10:50,调研分析,未开发)
- **对象**:`D:\dshworkspace\plugin_package`(5 插件 3556 行 client.js 全读):dsh-plugin-mcn(主插件:首页+AI写脚本+AI写作复盘+AI会话)、douyin-accounts(热门账号)、douyin-account-detail(账号详情)、douyin-video-detail(视频详情)、mcn-schedule(计划任务)
- **核心结论**:dsh 插件页面 =「数据管理 + 任务触发」界面,全部依赖 dsh 宿主 `/mcn/api/*` + SQLite(db.js 存 account/video/rewrite/review/persona)+ MCP 解析 + AI 会话桥接(creative/rewrite/analyze/extract 触发 AI);我们的工作台 = 零依赖 Node 读产出文件,无 DB 无 AI 桥接 → 分层迁移:✅读文件可落地(视频详情3tab、账号设定、脚本/分镜查看,产出浏览已部分覆盖);⚠️需 DB 重建(账号/视频列表、周榜、复盘、计划任务);❌按钮触发AI在 WorkBuddy 无桥接做不了(上轮已确认)
- **页面清单(8 视图)**:工作台首页(统计条+入口网格+抖音周榜)/热门账号/账号详情(信息卡+3tab+视频列表)/视频详情(信息卡+3tab)/AI写脚本(列表+源vsAI对比+分镜)/AI写作复盘(评分+报告)/AI会话(任务会话)/计划任务(定时CRUD)
- **待用户决策落地范围**
## MCN工作台数据功能页开发完成(11:00-11:20)
- **用户选定**:全做 + 抖音周榜(数据在 `D:\dshworkspace\抖音榜单`),4 项:精致展示页/账号视频管理库/prompt 快捷触发/周榜
- **数据源探查结论**:dsh 库 `~/.dsh/mcn-plugin.db` 有现成数据(hot_accounts 7 / account_videos 597 / account_video_source 39 / account_video_analysis 12 / account_persona 5 / rewrite_log 17 / storyboard_log 3 / script_review 2);周榜 JSON `抖音周榜_{赛道}_{日期}.json`(9 赛道×2 日期,字段 rank/accountName/comprehensiveScore/followers/newFans/newLikes/newComments/newShares/newInteraction/profileUrl);达人账号表 D:\dshworkspace\达人账号表.xlsx
- **技术路线**:Node 22.22.2 `node:sqlite` 直接只读 dsh 库(实验性但可用);新增 `dsh-data.js`(数据访问层:listAccounts/listAccountVideos/getPersona/getVideoDetail/getVideoScript/listRewrites/listStoryboards/getReviewDetail/getReviewFull/getStats/rankingMeta/getRanking);server.js 注册 13 个 `/api/dsh/*` 路由
- **前端重构**:index.html 改为 hash 路由(首页/产出浏览/ranking/accounts/account/:id/video/:id/rewrites/reviews);app.js 拆为路由核心(工具/markdown/复制/首页/产出浏览/设置),新增 data-pages.js(6 个数据页:周榜/热门账号/账号详情/视频详情/AI写脚本/复盘)
- **关键降级**:所有「触发AI」按钮(导入/解析/改写/提炼/复盘/创作)→ 点一下复制 prompt 到剪贴板(WorkBuddy 无 AI 会话桥接);只读展示不写库
- **修复**:getRanking 参数 date 与局部变量重名(SyntaxError);视频详情标题被 esc 转义(infoGrid 加 raw 参数);账号详情视频 ID 加详情链接
- **验证**:13 个 API curl 全过(meta/stats/accounts/ranking/video-detail/rewrites 数据正确);前端 3 JS 语法检查过;静态资源 200
- **遗留**:browser-harness 环境未装,无法浏览器实测,页面运行时效果待用户点验;xlsx 在线预览未做(零依赖取舍)
## 工作台数据库隔离:复制 dsh 库到工作台(11:44)
- **用户需求**:数据库复制一份到工作台文件夹,两边数据各访问各的(工作台读自有副本,不再读 dsh 原库)
- **执行**:`cp ~/.dsh/mcn-plugin.db → mcn-work-shop/mcn-plugin.db`(4.2MB);dsh-data.js `DSH_DB` 从 `homedir()/.dsh/mcn-plugin.db` 改为 `__dirname/mcn-plugin.db`(移除 homedir import);server.js dshGuard 文案改「工作台数据库」
- **gitignore**:根 .gitignore 加 `mcn-work-shop/mcn-plugin.db`(数据文件不提交 git)
- **验证**:重启服务,`/api/dsh/meta` 返回 dbPath=`D:\AgentSkill\...\mcn-work-shop\mcn-plugin.db`,accounts total 7 正常 ✅;SKILL.md 工作台章节数据边界同步更新
- **隔离语义**:工作台副本为静态快照,dsh 原库后续更新不会自动同步到工作台(需再手动复制);工作台只读副本不写回
- **外链新标签打开**(11:40 前置):视频/账号外链由 `<a target=_blank>` 改为 `data-ext` + 全局委托 `window.open(url,'_blank')`,被拦截时兜底复制链接
## 工作台图标全面扁平化(12:14)
- **需求**:美化所有页面,图标换成扁平化向量图标、不要底色(原 emoji 有彩色/底色感)
- **实现**:app.js 加 `ICON_PATHS`(Lucide 风格线性:24 viewBox / stroke currentColor / fill none)+ `svgIcon(name,size)` + `initIcons()`(把 `[data-icon]` 占位替换成 SVG);EXT_ICON 改图标名(md=file-text/json=file-code/xlsx/csv=table/bak=file);替换范围=header 按钮(home/help/settings)、logo(film)、首页 data-card(trending-up/users/pen/flask)、帮助页 5 功能块(lightbulb/pen/refresh/chart/wrench)、三模式(zap/users/wrench)、文件树目录/文件图标(folder/folder-open/file-*)、弹窗关闭 ✕→x、页面标题
- **CSS**:`.ic`(inline-block/vertical-align/flex-shrink)+ .logo/.data-card-icon/.page-title/.mode-name/.recent-card-title/.modal h3/.ghost 加 flex 对齐 + 图标用主题色 currentColor 无底色
- **保留的语义符号**(非图标):✅❌⚠️ 状态、☆ 收藏、▾▸ 展开箭头、👈 提示
- **验证**:双文件语法过、跨文件无 svgIcon 冲突、静态资源 200 ✅
- **微调(12:26)**:①功能图标加亮色区分(ICON_COLORS:trending-up橙红/users蓝/pen紫/flask绿/lightbulb金黄/refresh青/chart红/wrench深灰,svgIcon 按 name 注入 style color)②「AI写剧本」这类文字标题前去掉图标(recent-scripts 标题/recent-card 标题/data-pages 页面标题/三种创作模式标题),保留功能卡片图标(data-card/func-card)作视觉标识
## 首页新增 AI写剧本快捷卡片(11:48)
- **需求**:主页功能入口下方加「AI写剧本」卡片列表,点击快速查看剧本内容,最多 4 行
- **后端**:dsh-data.js 加 `listRecentScripts(limit)`(rewrite_log 联 hot_accounts/account_videos,status=done 有内容按 id 倒序取前 N);server.js 加 `/api/dsh/recent-scripts?limit=4`
- **前端**:renderHome 在 data-cards 后加 recent-scripts 区块(标题 + 「查看全部→」链到 #/rewrites);router 首页分支调 loadRecentScripts() 异步填充;openRecentScript 弹窗用 renderMarkdown 渲染 script_text 全文;app.js 加 fmtTime;style.css 加 recent-card 网格卡片样式
- **验证**:recent-scripts 返回 4 条(旧梦留声机账号,脚本长度 2614-4015),静态资源 200 ✅
## 帮助页拆分 + AI写剧本卡片迭代(11:52-11:57)
- 功能帮助快速提问区(5大功能块+问法+三模式)独立成 #/help 页,header 加「❓帮助」按钮(设置左边),首页只留功能入口卡+AI写剧本卡
- AI写剧本卡片迭代:2 列布局(minmax 380px)、最多 8 个(limit=8)、卡片 min-height 172px、预览 5 行(line-clamp 5)
## 修复:数据功能页全部无法点击(11:58,P0)
- **症状**:首页 4 个数据功能卡点击后跳回首页,看似"点不动"
- **根因**:app.js 加的 `function fmtTime`(函数声明,挂 window)与 data-pages.js 的 `const fmtTime`(全局词法绑定)**跨 script 同名冲突** → `SyntaxError: Identifier 'fmtTime' has already been declared` → data-pages.js 整个加载失败 → window.DataPages 未定义 → router 走「未知路由→首页」兜底
- **修复**:app.js 的 `fmtTime` 重命名 `fmtDate`(3 处:定义 + 2 处使用),消除冲突
- **验证**:vm 模拟跨 script 全局,确认无冲突;node -c 双文件语法过;curl 确认 fmtDate 3 处 / fmtTime 零残留 ✅
- **教训**:多 script 文件共享全局作用域,`function 声明` 与 `const/let` 同名会跨文件冲突(node -c 单文件查不出);给全局工具函数命名前应 grep 全项目避免与其它文件撞名