更新技能:完善主工作流、面板UI规范与交付物核查脚本
This commit is contained in:
@@ -50,7 +50,7 @@ description: 自动化克隆、初始化、品牌化、Docker 部署并提交项
|
||||
| 14 | 端口检查与分配 | Docker 项目必做,非 Docker 跳过 | 不改变 UI |
|
||||
| 15 | **改造后构建与启动** | 必做 | Docker 项目构建镜像启动容器;非 Docker 项目手动构建并启动改造版 |
|
||||
| 16 | 健康验证 | 必做 | 服务健康、面板审计 0 违规、全功能走查无报错 |
|
||||
| 17 | 产品截图与全功能录屏 | 必做 | 采集当前产品全套高清界面截图(中性文件名)+ 全功能演示录屏;无 before/after |
|
||||
| 17 | 产品截图与全功能录屏 | 必做 | 在最终健康版本上重新采集全套高清界面截图和录屏;逐张核对 README 引用;监控页必须验证真实视频帧、时间轴增长和画面能量,禁止空画面/旧图复用 |
|
||||
| 18 | 标准化 README 与版本归档 | 必做 | 按当前产品口径编写 README;不主动出现来源/致谢/版本对比;按授权决定是否提交 |
|
||||
| 19 | 交付物核查 | 必做 | 运行交付物阻断式核查,7 项交付物齐备并生成交付 manifest |
|
||||
|
||||
@@ -69,6 +69,19 @@ description: 自动化克隆、初始化、品牌化、Docker 部署并提交项
|
||||
4. 全功能录屏应完整展示登录、概览大屏、业务页面、AI 配置、系统管理、表格/弹窗交互等核心流程;
|
||||
画面无卡顿、无黑屏、无报错,录屏界面必须与最终截图一致。
|
||||
5. 素材目录、采集时间、对应版本(git commit 或“未提交工作区”)记录在内部 manifest;对外清单只列甲方需要的信息。
|
||||
6. **README 图片完整性与新鲜度是阻断项**:
|
||||
- 先解析 README 中全部本地图片引用,列出“引用路径 → 实际文件”清单;任何引用缺失、路径大小写不一致、解压后不可见均不得交付。
|
||||
- 页面发生修改后,README 引用的所有界面图片必须在最终构建、部署、健康检查通过后重新获取;不得只替换部分图片或沿用历史截图。
|
||||
- 截图前后记录文件哈希和修改时间;若最终截图哈希仍属于修改前文件,必须重采。
|
||||
7. **监控/视频页空画面判定(硬性阻断)**:
|
||||
- 进入页面后不得立即截图;必须等待所有播放器加载成功:`videoWidth/videoHeight > 0`、`readyState >= 2`(优先 4)、`!paused`;
|
||||
- 即使所有视频已 ready,也必须额外静置等待 **不少于 10 秒**,再采样两次并确认每一路 `currentTime` 均持续推进;
|
||||
- 必须对页面中的**每一路视频瓦片**分别绘制离屏 canvas,逐路计算像素均值/能量;禁止只校验第一路或只统计其中一个视频;
|
||||
- 截图后必须重新读取**输出后的 PNG 文件**,按每个视频元素的 `getBoundingClientRect()` 区域逐块分析像素,确认文件本体每一路均为真实画面;
|
||||
- 视频瓦片建议阈值:画面均值 > 25、画面能量 > 10,且不得为纯黑、纯白、空白占位图;若源视频本身偏暗,应通过多帧时间推进、纹理能量和人工目检共同确认;
|
||||
- 视频墙/监控墙必须使用固定视口截图,禁止对该页使用 `fullPage` 后改变合成尺寸;截图前可轻微滚动并回到顶部,强制合成器刷新;
|
||||
- HLS 地址需返回 HTTP 200,播放列表包含可访问的分片;设备模拟服务、密钥、主题和端口必须与最终服务一致。
|
||||
8. **录屏复核**:录屏完成后检查分辨率、帧率、时长、封装和关键页面片段;必须抽取监控段多帧进行逐路分析,确认全部视频瓦片均有真实动态画面,不允许用旧录屏或静态拼接视频替代。
|
||||
|
||||
## 执行原则
|
||||
|
||||
@@ -124,7 +137,7 @@ description: 自动化克隆、初始化、品牌化、Docker 部署并提交项
|
||||
步骤 9 除面板视觉外,当用户指定 AI 服务商(如 TokenFree、官方 OpenAI、第三方中转等)时,必须完成:
|
||||
|
||||
1. **默认配置预填**:在 AI 设置的默认值中写入用户指定的 Base URL 与默认模型,而不是保留模板里的旧服务商。
|
||||
- OpenAI 兼容网关的地址必须带 `/v1`(如 `https://www.tokenfree.com/v1`)。
|
||||
- 标准 Chat Completions网关的地址必须带 `/v1`(如 `https://www.tokenfree.com/v1`)。
|
||||
- 模型 ID 必须以服务商实际支持的字符串为准(可通过其定价/模型列表页核实,例如 TokenFree 上为 `kimi-k2.6`),禁止凭名称臆造。
|
||||
2. **本地缓存版本迁移(强制)**:设置存储 key 必须带版本后缀(如 `parking-ai-settings-v2`)。
|
||||
- 切换服务商时升级版本,避免老用户 localStorage 中的旧 Base URL / 旧模型覆盖新默认值。
|
||||
@@ -137,7 +150,7 @@ description: 自动化克隆、初始化、品牌化、Docker 部署并提交项
|
||||
- 明确展示 Base URL、默认模型,并说明 Key 仅保存在本地浏览器;
|
||||
- 说明可替换为该服务商支持的其他模型。
|
||||
4. **README 同步**:项目 README 必须增加对应「AI 对话使用教程」章节(含配置表与步骤)。
|
||||
5. **协议兼容**:调用遵循 OpenAI 兼容协议(`POST {baseUrl}/chat/completions` 流式、`GET {baseUrl}/models` 测试连接);未拿到用户 Key 时不得伪造 Key,也不得把测试失败谎报为成功。
|
||||
5. **协议兼容**:调用遵循 标准 Chat Completions 协议(`POST {baseUrl}/chat/completions` 流式、`GET {baseUrl}/models` 测试连接);未拿到用户 Key 时不得伪造 Key,也不得把测试失败谎报为成功。
|
||||
6. **教程 UI 主题**:教程中的列表、行内代码、链接、注释文字必须使用深色玻璃面板配色,禁止出现白底黑字的教程块嵌入深色抽屉。
|
||||
|
||||
## 页面信息修改的强制要求
|
||||
@@ -300,10 +313,12 @@ python scripts/workflow_manager.py report <project_dir>
|
||||
- 阻断式面板 UI 审计退出码为 0,10 个核心页面/路由无对比度和“外黑内白”违规。
|
||||
- Modal、Drawer、Select、DatePicker、Popover、Tooltip 和 Alert/Tag 等组件均通过暗色主题与对比度检查。
|
||||
- 移动端布局正常,动效不会导致明显卡顿。
|
||||
- AI 对话功能可用,支持 OpenAI 兼容接口和流式输出;默认服务商、Base URL、默认模型与用户要求一致,内置使用教程,且本地配置 key 已做版本迁移。
|
||||
- AI 对话功能可用,支持 标准 Chat Completions 接口和流式输出;默认服务商、Base URL、默认模型与用户要求一致,内置使用教程,且本地配置 key 已做版本迁移。
|
||||
- 甲方可见材料无外部项目链接、原作者、致谢和版本对比;源码许可证/NOTICE 已按法律要求完整保留。
|
||||
- 商业痕迹与来源痕迹全部清理,grep 复查交付物中无残留。
|
||||
- 内部基线截图只用于核对、不随包交付;对外界面截图与录屏采集于最终构建并健康通过的版本,页面全覆盖、录屏完整,归档链接长期有效、可访问下载。
|
||||
- README 全部本地图片均已逐引用解析、重新采集并打包;解压后路径、大小写、图片尺寸和显示状态验证通过。
|
||||
- 监控/视频类页面已验证真实播放:HLS/视频地址可访问;页面打开后静置不少于 10 秒,全部视频瓦片逐路通过帧尺寸、播放状态、时间推进和画面能量校验,并直接分析输出 PNG,不存在空监控、黑屏、局部未绘制或旧截图。
|
||||
- 标准化 README 覆盖全部必备内容,以当前产品口径编写,图文结合、架构图准确、部署教程可落地,且不作虚假权属表述。
|
||||
- 7 项交付物齐备,`.Codex/delivery/manifest.md` 完整;`deliverables_check.py` 退出码为 0。
|
||||
- 保密与知识产权要求已遵守:成果不私用/不外传,交付材料与验收记录可溯源。
|
||||
|
||||
@@ -287,7 +287,7 @@ export default defineConfig({
|
||||
- API 设置使用右侧抽屉或弹窗,不离开当前页面。
|
||||
- 流式输出时光标可用轻微闪烁效果。
|
||||
- 服务商对接(用户指定时强制):
|
||||
- 默认 Base URL 与默认模型必须预填为用户指定值;OpenAI 兼容网关地址以 `/v1` 结尾(例:`https://www.tokenfree.com/v1` + `kimi-k2.6`)。
|
||||
- 默认 Base URL 与默认模型必须预填为用户指定值;标准 Chat Completions网关地址以 `/v1` 结尾(例:`https://www.tokenfree.com/v1` + `kimi-k2.6`)。
|
||||
- 模型 ID 以服务商模型/定价页面实际字符串为准,禁止臆造。
|
||||
- 本地设置 key 必须带版本号;切换服务商时升级版本,旧配置只允许迁移用户自填 API Key。
|
||||
- 设置抽屉内必须内置深色玻璃风格使用教程:官网链接 → 注册登录 → 控制台创建 API Key(`sk-` 开头)→ 粘贴 → 测试连接 → 保存;并展示 Base URL、默认模型及「Key 仅保存在本地」说明。
|
||||
|
||||
@@ -185,18 +185,33 @@ def main() -> int:
|
||||
kws = [k.strip() for k in args.trace_keywords.split(",") if k.strip()]
|
||||
traces: list[str] = []
|
||||
if kws:
|
||||
pat = re.compile("|".join(re.escape(k) for k in kws), re.I)
|
||||
for p in iter_files(root):
|
||||
if p.suffix.lower() not in SCAN_SUFFIXES:
|
||||
# before/after 需要按独立词识别,避免 beforeEach、::before、::after 等代码语法误报。
|
||||
exact_keywords = [k for k in kws if k.lower() not in {"before", "after"}]
|
||||
exact_pat = (
|
||||
re.compile("|".join(re.escape(k) for k in exact_keywords), re.I)
|
||||
if exact_keywords else None
|
||||
)
|
||||
boundary_pats = {
|
||||
"before": re.compile(r"(?<![A-Za-z_:-])before(?![A-Za-z_:-])", re.I),
|
||||
"after": re.compile(r"(?<![A-Za-z_:-])after(?![A-Za-z_:-])", re.I),
|
||||
}
|
||||
active_boundary_pats = [
|
||||
boundary_pats[k.lower()] for k in kws if k.lower() in boundary_pats
|
||||
]
|
||||
for file_path in iter_files(root):
|
||||
if file_path.suffix.lower() not in SCAN_SUFFIXES:
|
||||
continue
|
||||
rel = str(p.relative_to(root))
|
||||
rel = str(file_path.relative_to(root))
|
||||
if re.search(r"license|copying", rel, re.I):
|
||||
continue
|
||||
try:
|
||||
txt = p.read_text(encoding="utf-8", errors="ignore")
|
||||
file_text = file_path.read_text(encoding="utf-8", errors="ignore")
|
||||
except OSError:
|
||||
continue
|
||||
if pat.search(txt):
|
||||
matched = bool(exact_pat and exact_pat.search(file_text))
|
||||
if not matched:
|
||||
matched = any(pat.search(file_text) for pat in active_boundary_pats)
|
||||
if matched:
|
||||
traces.append(rel)
|
||||
if traces:
|
||||
violations.append("痕迹清理不彻底,以下文件命中原标识关键词:%s" % "、".join(sorted(set(traces))[:20]))
|
||||
|
||||
Reference in New Issue
Block a user