09-10 工作台:配置收敛、复盘字段契约修复、原创选题分镜支持、榜单期号区间显示

配置收敛:
- 端口/DB名/产出根/榜单目录单源化到 mcn-work-shop/config.json,代码层统一经 load-config.js 读取
- 新增 get-port.js 供 start.bat 读端口(bat 内嵌 node -e 会被 cmd 截断,读到的是兜底值)
- start.bat 修复失效的 managed node 路径(原写死 22.22.2 已不存在),改为遍历 versions 自动探测

复盘诊断页(真 bug 修复):
- 问题清单严重度全部显示成绿色 + 修改建议不显示:模型输出 {sev:'high',fix} 与前端读取 {severity:'高',suggestion} 字段名与取值均不匹配
- 前端新增 normIssue 归一化,兼容 sev/severity/level 与中英取值,并回补所属维度显示
- 在 submit-review-tasks 与诊断/复盘 prompt 中固化 issues_json 字段契约,从源头防 schema 漂移

分镜提示词:
- 原创选题(video_id 为空)原本无生成入口(分镜按 video_id 查询)
- listStoryboards 支持按 rewrite_id 查询,前端放开入口、切版本重查,并补落库指令(此前入库靠模型自由发挥)

榜单展示:
- 期号改为显示区间「08/31 ~ 09/06」,避免被误读为单日(期号=该周周一)
- 后端新增 collectRanges,从落盘文件读真实 dateStart/dateEnd 随 API 返回(日榜 start=end 不显区间)

其他:
- 清理 dsh 环境废弃后的历史叙述类废话(16 文件约 18 处),文末变更记录区保留
- 新增 docs/工作台UI规范.md(设计 token / 布局 / 8 页面路由 / 12 类组件 / 9 条已知坑)
This commit is contained in:
maogeigei committed 2026-09-10 18:28:42 +08:00
1 parent 3926d742fd
commit 0165144292
58 files changed
+895 -263

No files matched your search

@@ -87,12 +87,11 @@ export REDFOX_API_KEY="ak_xxx..."
### 落盘目标(按运行环境 + 数据源分层)
> 桌面 `MCNSkill项目\` 顶层先分「业务账号层 / 三方数据层」:账号产出(分析、脚本等)直挂账号文件夹,**三方数据统一下 `三方数据\{数据源}\`**——后续数据获取不止一个数据源,每个数据源一个文件夹(当前红狐数据源=`红狐数据\`),其下再按数据类型分(抖音榜单/信息源数据/作品数据…)。**文件名不加数据源前缀**(保持 `抖音周榜_` 等榜名开头,兼容 dsh 工作台 RANKING_DIR 正则 `^抖音周榜_`)。
> 桌面 `MCNSkill项目\` 顶层先分「业务账号层 / 三方数据层」:账号产出(分析、脚本等)直挂账号文件夹,**三方数据统一下 `三方数据\{数据源}\`**——后续数据获取不止一个数据源,每个数据源一个文件夹(当前红狐数据源=`红狐数据\`),其下再按数据类型分(抖音榜单/信息源数据/作品数据…)。**文件名不加数据源前缀**(保持 `抖音周榜_` 等榜名开头,兼容工作台 RANKING_DIR 正则 `^抖音周榜_`)。
| 环境 | 落盘目录 |
|---|---|
| ①③ 用户环境 / 开发机(本机无 `.dsh`) | 桌面\MCNSkill项目\三方数据\红狐数据\抖音榜单\(Windows/macOS 按系统解析桌面,禁止硬编码用户目录) |
| ② dsh 环境(本机有 `.dsh`) | `D:\dshworkspace\抖音榜单\`(兼容工作台 RANKING_DIR 现有读取) |
| 开发机 / 用户环境(两环境同构) | 桌面\MCNSkill项目\三方数据\红狐数据\抖音榜单\(Windows/macOS 按系统解析桌面,禁止硬编码用户目录) |
### 目录结构(09-03 起分目录管理,按工作台 tab 对齐)
@@ -112,7 +111,7 @@ export REDFOX_API_KEY="ak_xxx..."
| 3 点赞榜 | 作品维七日点赞飙升 | `点赞榜/抖音周榜_点赞榜_{周一}.json` | ✅ 已实现(fetch_week_ranks.py,全品类 TOP50) |
| 4 涨粉榜 | 账号维涨粉榜 | 平铺 `抖音涨粉榜_{赛道}_{日期}.json` | ✅ 已实现(douyin-rise-ranking 子技能命名,未接入工作台 tab) |
> **周粒度抓取器(工作台 视频热榜/点赞榜 数据源,09-03 重构定稿)**:`scripts/fetch_week_ranks.py` —— **不传赛道(type)= 全品类,每榜每期仅 1 次 API 调用**(禁止逐赛道/逐日循环)。hot = likesRank 传 周一~周日(服务端周聚合);likes = hotContentRank **source 必须为「抖音每日点赞飙升榜」生产名**(写「抖音七日点赞飙升榜-GitHub」返回空,09-03 实测修正),startTime 传周日(七日口径)。**★API 单次上限 TOP50**(limit=100 / page=2 / offset=50 均被忽略,09-03 实测),无 51-100 名获取途径,勿再探测。list 条目补 `rank`;顶层 `category:"全部"`(实际赛道在 list[].category,展示端按条目赛道筛选/下拉去重)。用法:`python scripts/fetch_week_ranks.py --board both [--date 2026-08-24] [--force]`。落盘目录解析同工作台(env `MCN_RANKING_DIR` → `.dsh` 部署 `D:\dshworkspace\抖音榜单` → 桌面 `三方数据\红狐数据\抖音榜单`)。**成本铁律(09-03 固化)**:涉及多赛道/多日/多窗口循环的付费调用前,必须先向用户确认调用次数与范围,禁止未经确认直接批量调用。
> **周粒度抓取器(工作台 视频热榜/点赞榜 数据源,09-03 重构定稿)**:`scripts/fetch_week_ranks.py` —— **不传赛道(type)= 全品类,每榜每期仅 1 次 API 调用**(禁止逐赛道/逐日循环)。hot = likesRank 传 周一~周日(服务端周聚合);likes = hotContentRank **source 必须为「抖音每日点赞飙升榜」生产名**(写「抖音七日点赞飙升榜-GitHub」返回空,09-03 实测修正),startTime 传周日(七日口径)。**★API 单次上限 TOP50**(limit=100 / page=2 / offset=50 均被忽略,09-03 实测),无 51-100 名获取途径,勿再探测。list 条目补 `rank`;顶层 `category:"全部"`(实际赛道在 list[].category,展示端按条目赛道筛选/下拉去重)。用法:`python scripts/fetch_week_ranks.py --board both [--date 2026-08-24] [--force]`。落盘目录解析同工作台(env `MCN_RANKING_DIR` → 桌面 `三方数据\红狐数据\抖音榜单`,**无 dsh 分支**)。**成本铁律(09-03 固化)**:涉及多赛道/多日/多窗口循环的付费调用前,必须先向用户确认调用次数与范围,禁止未经确认直接批量调用。
> 子技能 douyin-daily-hot(视频热榜)/ douyin-content-surge(点赞榜)日粒度归档沿用各自 SKILL.md 命名;**工作台周粒度文件一律 fetch_week_ranks.py 落盘对应子目录**,避免日/周口径混入。douyin-weekly-surge(官方七日口径)落盘 `抖音七日飙升榜_…` 命名保留,未接入工作台 tab。
@@ -50,15 +50,15 @@
数据按类型分三个文件夹存放;**榜单数据**因属「同日期固定快照」+ API 按调用计费,**采用业务数据目录落盘 + 查询先查本地缓存命中免 API**(09-03 定稿规范):
| 数据类型 | 归档目录(①③用户/开发机) | 归档目录(②dsh 环境) | 说明 |
|---|---|---|---|
| **榜单数据**(账号周榜/视频热榜/点赞榜/涨粉榜/日榜/月榜/七日飙升等) | 桌面\MCNSkill项目\三方数据\红狐数据\抖音榜单\(按运行系统解析桌面,禁止硬编码用户目录) | `D:\dshworkspace\抖音榜单\` | 桌面顶层先分「业务账号/三方数据」:三方数据统一 `三方数据\{数据源}\`(当前=红狐数据);文件命名 `{榜名}_{赛道}_{数据日期}.json` 不加数据源前缀;详见 [SKILL.md 榜单数据落盘规范](../../SKILL.md) |
| **信息源数据**(AI信息源、短剧信息源等) | `RedFox数据\信息源数据\YYYY-MM\` | 同(沙箱内) | 按月分文件夹 |
| **作品数据**(单作品爬取、账号诊断等) | `RedFox数据\作品数据\YYYY-MM-DD\` | 同 | 按日分文件夹 |
| 数据类型 | 归档目录(开发机 / 用户环境同构) | 说明 |
|---|---|---|
| **榜单数据**(账号周榜/视频热榜/点赞榜/涨粉榜/日榜/月榜/七日飙升等) | 桌面\MCNSkill项目\三方数据\红狐数据\抖音榜单\(按运行系统解析桌面,禁止硬编码用户目录) | 桌面顶层先分「业务账号/三方数据」:三方数据统一 `三方数据\{数据源}\`(当前=红狐数据);文件命名 `{榜名}_{赛道}_{数据日期}.json` 不加数据源前缀;详见 [SKILL.md 榜单数据落盘规范](../../SKILL.md)。**09-10 起 dsh 环境已废弃**(`D:\dshworkspace` 不存在),原「②dsh 环境」列删除 |
| **信息源数据**(AI信息源、短剧信息源等) | `RedFox数据\信息源数据\YYYY-MM\` | 按月分文件夹 |
| **作品数据**(单作品爬取、账号诊断等) | `RedFox数据\作品数据\YYYY-MM-DD\` | 按日分文件夹 |
### 2.2 日期命名规则
> 以下示例归档目录 = 表 2.1 对应环境的目录内(①③ = `三方数据\红狐数据\抖音榜单\`;② dsh = `D:\dshworkspace\抖音榜单\`)。
> 以下示例归档目录 = 表 2.1 的 `三方数据\红狐数据\抖音榜单\` 内(**无 dsh 分支**)。
- 归档文件夹日期按 **数据实际日期** 命名,**不是获取日期**。
- 例:8月8日获取8月7日的日榜 → 存入 `抖音榜单\抖音视频热榜_美食_2026-08-07.json`
@@ -1,6 +1,6 @@
# 路径引用规范(相对路径铁律,P0)
> 适用:本技能树(主技能 + references/references-add + scripts + 全部 subskills 及嵌套 subskills)。技能会被部署到 **开发机 / dsh 环境 / 用户环境** 三种机器,**绝对路径随机器变化必然失效**,故技能内一切文件引用一律使用**相对路径**。
> 适用:本技能树(主技能 + references/references-add + scripts + 全部 subskills 及嵌套 subskills)。技能会被部署到 **开发机 / 用户环境** 两种机器,**绝对路径随机器变化必然失效**,故技能内一切文件引用一律使用**相对路径**。
## 一、铁律(3 条)
@@ -18,12 +18,12 @@
| `__file__` 动态推导 | `BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))` | 脚本定位技能根,跨环境可迁移 |
| 环境变量 | `os.getenv("REDFOX_API_KEY")`、`MCN_RANKING_DIR` | 值由外部注入 |
| URL | `https://github.com/...` | 外部资源 |
| 环境判别锚点 | 「本机是否存在 `D:\AgentSkill`」「技能路径是否含 `.dsh`」 | 仅作**是否存在/是否包含**的判定条件,**禁止**将其作为实际读写路径 |
| 动态产出目录占位 | 桌面 `MCNSkill项目/{账号名}/`、`D:\dshworkspace\创作任务\` | 由各技能 `references(-add)/路径配置.md` 运行时判定,允许出现于规则文档 |
| 环境判别锚点 | 「技能目录是否处于 git 检出内」 | 仅作**是否存在**的判定条件,**禁止**将其作为实际读写路径;锚点必须用**仓库特征**(git 检出),禁止用写死盘符 |
| 动态产出目录占位 | 桌面 `MCNSkill项目/{账号名}/` | 由各技能 `references(-add)/路径配置.md` 运行时判定,允许出现于规则文档 |
## 三、禁令项(这些绝对禁止)
- **Windows 盘符绝对路径**:`C:\Users\maidou\...`、`D:\AgentSkill\...`(含正反斜杠两种写法)——除「环境判别锚点/路径配置规则表」语境外的任何引用位置。
- **Windows 盘符绝对路径**:`C:\Users\maidou\...`、`D:\MyRepo\...`(含正反斜杠两种写法)——除「环境判别锚点/路径配置规则表」语境外的任何引用位置。
- **Unix 绝对路径**:`/Users/maidou/...`、`/home/...`、`/tmp/...`(shebang `#!/usr/bin/env python3` 除外)。
- **越级引用**:`../../..` 跳出技能根指向包外文件。
- **引用技能包外文档**:md 链接指向不存在于包内的本地文件(如仓库根的维护文档)——部署环境无此文件即断链。
@@ -34,7 +34,7 @@
| 场景 | 说明 |
|------|------|
| 仅开发机工具 | 不随技能分发的目录(如 `mcn-work-shop/`),内部可保留开发机路径 |
| 环境判别/路径配置文档 | `路径配置.md`、SKILL.md 环境判定节——锚点 `D:\AgentSkill`、`.dsh`、`D:\dshworkspace\...` 是**规则内容**不是引用,保留 |
| 环境判别/路径配置文档 | `路径配置.md`、SKILL.md 环境判定节——锚点 git 检出特征是**规则内容**不是引用,保留 |
| 示例/教学文本 | `C:/Videos/demo.mp4`、`C:/path/to/file` 等明确示例(`path/to`、`demo` 字样) |
| 历史日志 | `.workbuddy/memory/` 既有日志保留原样,不改写历史 |
| 第三方整包 | 整包拷贝的第三方技能(如 browser-harness/lieflat-charts/参考skills/)内部自带约定不重写;但**本技能对它们的引用**仍须相对路径 |
@@ -50,13 +50,10 @@ CATEGORY_ALL = "全部"
def resolve_ranking_dir():
"""与 mcn-work-shop/dsh-data.js resolveRankingDir 同款:env → .dsh 部署 → 桌面 抖音榜单"""
"""与 mcn-work-shop/dsh-data.js resolveRankingDir 同款:env → 桌面 抖音榜单(09-10 起无 dsh 分支)"""
env = os.environ.get("MCN_RANKING_DIR", "").strip()
if env:
return env
here = os.path.abspath(__file__)
if ".dsh" in here.replace("\\", "/"):
return r"D:\dshworkspace\抖音榜单"
home = os.path.expanduser("~")
rel = os.path.join("MCNSkill项目", "三方数据", "红狐数据", "抖音榜单")
candidates = [
@@ -50,6 +50,6 @@ description: 抖音每日点赞飙升榜查询工具。日度收录全平台抖
## 安全约束
- **API Key**:仅通过 `os.getenv("REDFOX_API_KEY")` 获取,禁止读取系统文件
- **文件操作**:对话回复仅输出 Markdown 表格(不暴露原始 JSON);**榜单数据落盘到业务数据目录**(白名单例外,详则见主 [SKILL.md](../../SKILL.md)「榜单数据落盘规范」)——日粒度归档命名 `抖音点赞榜_{赛道}_{数据日期}.json`,目标 `桌面\MCNSkill项目\三方数据\红狐数据\抖音榜单\`(①③环境)或 `D:\dshworkspace\抖音榜单\`(②dsh 环境)。**查询前先 `ls` 本地缓存命中免 API**(同榜名+赛道+数据日期全机器只调一次 API)。工作台「点赞榜」周粒度文件(`抖音周榜_点赞榜_{赛道}_{周一}.json`)由主技能 `scripts/fetch_week_ranks.py` 统一落盘,本技能不做周粒度输出。
- **文件操作**:对话回复仅输出 Markdown 表格(不暴露原始 JSON);**榜单数据落盘到业务数据目录**(白名单例外,详则见主 [SKILL.md](../../SKILL.md)「榜单数据落盘规范」)——日粒度归档命名 `抖音点赞榜_{赛道}_{数据日期}.json`,目标 `桌面\MCNSkill项目\三方数据\红狐数据\抖音榜单\`(开发机与用户环境同构,**无 dsh 分支**)。**查询前先 `ls` 本地缓存命中免 API**(同榜名+赛道+数据日期全机器只调一次 API)。工作台「点赞榜」周粒度文件(`抖音周榜_点赞榜_{赛道}_{周一}.json`)由主技能 `scripts/fetch_week_ranks.py` 统一落盘,本技能不做周粒度输出。
- **网络请求**:脚本使用 `urllib.request`(标准库),禁止调用外部脚本或 subprocess
- **输出内容**:仅输出 Markdown 表格格式榜单,不暴露原始 JSON
@@ -10,7 +10,7 @@ description: 抖音每日最热作品榜,日度收录全平台抖音作品,
1. **路径沙箱**:文件操作限定在技能根目录内
2. **API Key**:仅 `os.getenv("REDFOX_API_KEY")`,禁止 .env/dotenv/配置文件读取
3. **无系统命令**:不调用 subprocess/eval/exec/system()
4. **输出限定**:仅 stdout(Markdown 表格对话回复);**榜单数据同时落盘到业务数据目录**(白名单例外,详则见主 [SKILL.md](../../SKILL.md) 「榜单数据落盘规范」)——日粒度归档命名:`抖音视频热榜_{赛道}_{数据日期}.json`,目标 `桌面\MCNSkill项目\三方数据\红狐数据\抖音榜单\`(①③环境)或 `D:\dshworkspace\抖音榜单\`(②dsh 环境)。**查询前先 `ls` 本地缓存命中免 API**(同榜名+赛道+数据日期全机器只调一次 API)。工作台「视频热榜」周粒度文件(`抖音周榜_视频热榜_{赛道}_{周一}.json`)由主技能 `scripts/fetch_week_ranks.py` 统一落盘,本技能不做周粒度输出。
4. **输出限定**:仅 stdout(Markdown 表格对话回复);**榜单数据同时落盘到业务数据目录**(白名单例外,详则见主 [SKILL.md](../../SKILL.md) 「榜单数据落盘规范」)——日粒度归档命名:`抖音视频热榜_{赛道}_{数据日期}.json`,目标 `桌面\MCNSkill项目\三方数据\红狐数据\抖音榜单\`(开发机与用户环境同构,**无 dsh 分支**)。**查询前先 `ls` 本地缓存命中免 API**(同榜名+赛道+数据日期全机器只调一次 API)。工作台「视频热榜」周粒度文件(`抖音周榜_视频热榜_{赛道}_{周一}.json`)由主技能 `scripts/fetch_week_ranks.py` 统一落盘,本技能不做周粒度输出。
## 执行流程
@@ -10,7 +10,7 @@ description: 抖音涨粉账号推荐(涨粉榜)查询工具。统计抖音
1. **路径沙箱**:文件操作限定在技能根目录内;产物落盘走主技能白名单例外(见下)
2. **API Key**:仅 `os.getenv("REDFOX_API_KEY")`,禁止 .env/dotenv/配置文件读取
3. **无系统命令**:不调用 subprocess/eval/exec/system()
4. **输出限定**:仅 stdout(Markdown 表格对话回复 + JSON 原始数据);**榜单数据同时落盘到业务数据目录**(白名单例外,详则见主 [SKILL.md](../../SKILL.md)「榜单数据落盘规范」)——命名 `抖音涨粉榜_{赛道}_{数据日期}.json`,目标 `桌面\MCNSkill项目\三方数据\红狐数据\抖音榜单\`(①③环境)或 `D:\dshworkspace\抖音榜单\`(②dsh 环境)。**查询前先 `ls` 本地缓存命中免 API**(同榜名+赛道+数据日期全机器只调一次 API)
4. **输出限定**:仅 stdout(Markdown 表格对话回复 + JSON 原始数据);**榜单数据同时落盘到业务数据目录**(白名单例外,详则见主 [SKILL.md](../../SKILL.md)「榜单数据落盘规范」)——命名 `抖音涨粉榜_{赛道}_{数据日期}.json`,目标 `桌面\MCNSkill项目\三方数据\红狐数据\抖音榜单\`(开发机与用户环境同构,**无 dsh 分支**)。**查询前先 `ls` 本地缓存命中免 API**(同榜名+赛道+数据日期全机器只调一次 API)
## 执行流程
@@ -68,7 +68,7 @@ cd {SKILL_ROOT} && python scripts/douyin_weekly_surge.py --full #
### 5. 交付
- 直接输出 Markdown 表格(对话回复);**榜单数据同时落盘到业务数据目录**(白名单例外,详则见主 [SKILL.md](../../SKILL.md)「榜单数据落盘规范」)—— `抖音七日飙升榜_{赛道}_{数据日期}.json`,目标 `桌面\MCNSkill项目\三方数据\红狐数据\抖音榜单\`(①③环境)或 `D:\dshworkspace\抖音榜单\`(②dsh 环境)。**查询前先 `ls` 本地缓存命中免 API**(同榜名+赛道+数据日期全机器只调一次 API)
- 直接输出 Markdown 表格(对话回复);**榜单数据同时落盘到业务数据目录**(白名单例外,详则见主 [SKILL.md](../../SKILL.md)「榜单数据落盘规范」)—— `抖音七日飙升榜_{赛道}_{数据日期}.json`,目标 `桌面\MCNSkill项目\三方数据\红狐数据\抖音榜单\`(开发机与用户环境同构)。**查询前先 `ls` 本地缓存命中免 API**(同榜名+赛道+数据日期全机器只调一次 API)
- 详情参阅 `references/api-config.md`(API 详情)和 `references/interaction-guide.md`(交互示例)
## 安全约束