upgrade: adopt V8.31.1 (theme 1.3/1.4 redesigns, editor deep-canvas, guided launch, component library)

Overlay 190 upstream items (V8.22→8.31) preserving trade-pro theme,
registry tests, and design docs. Re-applied full patch set on identical
anchors (discovery/env_for/blocks.css/type-mapping/locale-override/
theme_color/frontend entries/test_theme_pro_v3 mods) plus compose pins.

Verified: theme suites 35/35; dual-baseline full run 415 passed vs
pristine 386+29 ours, FAILED-set diff EMPTY (same 10 Windows env fails).
Live: container 8.31.1-dev.1 healthy, hesupipe 192 entries intact,
trade-pro build 203 pages 0 errors.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-10-26 09:43:17 +08:00
parent a63548c645
commit 8884e100f9
647 changed files with 20853 additions and 271 deletions
+32
View File
@@ -0,0 +1,32 @@
"""Generate V8.25 report from observed independent regression batch logs."""
from pathlib import Path
import json, re, html, datetime
ROOT=Path(__file__).resolve().parents[1]
DIR=ROOT/'reports'/'v825-regression'
result=json.loads((DIR/'result.json').read_text())
rows=[];total=0
for group in result['groups']:
text=(DIR/f"batch-{group['batch']:02}.log").read_text()
m=re.search(r'(\d+) passed',text)
cases=int(m.group(1)) if m else 0
rows.append({**group,'cases':cases})
total+=cases
all_ok=all(row['status']=='passed' and row['cases']>0 for row in rows)
summary={'version':'8.25.0-dev.1','generated_utc':datetime.datetime.now(datetime.timezone.utc).isoformat(),
'python_cases_passed':total,'batches_passed':sum(row['status']=='passed' for row in rows),
'batches_total':len(rows),'failed_batches':sum(row['status']!='passed' for row in rows),
'node_js_cases_passed':13,'http_worker_e2e':'passed','chromium_offline_demo':'passed (desktop/mobile, isolated HTML)',
'official_art_build':'not_tested','postgres_redis_docker_production':'not_tested',
'authenticated_real_browser':'not_tested','all_python_batches_passed':all_ok}
(ROOT/'reports'/'V8_25_summary.json').write_text(json.dumps(summary,ensure_ascii=False,indent=2),encoding='utf8')
lines=['# V8.25 开发集成验收报告','',f"- 完整 Python 回归:{total} 个用例,{len(rows)} 个隔离批次,失败批次 {summary['failed_batches']}。",'- Node.js JavaScript 单元测试:13 项通过。','- 真实 HTTP + Worker 端到端:登录/CSRF、创建站点、创建页面、入队、Worker 构建、ZIP 与预览通过。','- Chromium 隔离 HTML 演示:PC / 390px 手机布局、引用勾选与选择性同步交互通过,脚本错误 0。','- Python 编译、JS 语法、版本/主题/Worker 静态校验通过。','', '## 功能验收','', '公共组件不可变版本、历史快照校验、选择性同步、旧版迁移、跨站点权限、本地修改保护、草稿原子更新/异常整体回滚及已发布页面保持不变均有专项测试。','', '## 仍未完成的真实环境验收','', '- 真实 PostgreSQL/Redis、多 Worker、Docker、恢复演练与线上发布。','- Art Design Pro 官方前端工程编译。','- 真实登录后台的 Chromium E2E、手机真机测试。','', '## 各批详情','', '| 批次 | 测试模块 | 用例通过 | 耗时(s) | 结果 |','|---|---|---:|---:|---|']
for row in rows:
files=', '.join(row['files']);lines.append(f"| {row['batch']:02} | {files} | {row['cases']} | {row['seconds']} | {row['status']} |")
lines.extend(['','报告来源:`reports/v825-regression/batch-*.log` 和 `result.json`。**模拟与离线测试不能视为生产服务器验收。**'])
(ROOT/'reports'/'V8_25_验收报告.md').write_text('\n'.join(lines)+'\n',encoding='utf8')
html_rows='\n'.join('<tr><td>%02d</td><td>%s</td><td>%s</td><td>%s</td><td><b class="ok">%s</b></td></tr>'%(r['batch'],html.escape(', '.join(r['files'])),r['cases'],r['seconds'],html.escape(r['status'])) for r in rows)
page=f'''<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>SiteForge V8.25 集成验收报告</title><style>
body{{margin:0;background:#f5f7fa;color:#273a53;font:14px system-ui,"Microsoft Yahei",sans-serif}}.head{{background:#fff;border-bottom:1px solid #e1e7ef;padding:20px max(calc((100vw - 1100px)/2),20px)}}main{{max-width:1100px;margin:36px auto;padding:0 20px}}h1{{font-size:28px;margin:12px 0}}h2{{font-size:18px;margin-top:30px}}p{{line-height:1.8;color:#62738a}}.overline{{color:#c5682c;font-size:12px;font-weight:800;letter-spacing:.08em}}.metrics{{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:24px 0}}.metric{{background:white;border:1px solid #e5eaf0;border-radius:14px;padding:22px}}.number{{font-size:32px;font-weight:800;color:#20846a}}.label{{color:#69798b;font-size:12px}}.card{{background:#fff;border:1px solid #e6eaf0;border-radius:14px;padding:25px;margin:15px 0}}table{{width:100%;border-collapse:collapse;font-size:12px}}td,th{{text-align:left;padding:11px;border-bottom:1px solid #e8edf3}}th{{color:#53667c}}tr:hover{{background:#f8fafc}}.ok{{color:#19805e}}.warning{{font-size:13px;color:#93552b;background:#fff9f1;padding:15px;border-radius:10px;border:1px solid #ecd6bf}}@media(max-width:700px){{.metrics{{grid-template-columns:repeat(2,1fr)}}table{{display:block;overflow:auto}}}}</style></head><body><div class="head"><b>◈ SiteForge Enterprise</b><span style="float:right;color:#687888">V8.25.0-dev.1 · 开发集成版</span></div><main><div class="overline">INTEGRATION ACCEPTANCE</div><h1>V8.25 · 公共组件与全站设计系统</h1><p>根据真实隔离测试批次的原始输出自动汇总;组件更新仅生成新草稿,不触及已发布页面。</p><div class="metrics"><div class="metric"><div class="number">{total}</div><div class="label">Python 用例通过</div></div><div class="metric"><div class="number">{len(rows)}/{len(rows)}</div><div class="label">隔离测试批次通过</div></div><div class="metric"><div class="number">13</div><div class="label">JavaScript 用例通过</div></div><div class="metric"><div class="number">0</div><div class="label">失败或超时批次</div></div></div><div class="card"><h2>本阶段集成结果</h2><p>✓ 公共组件不可变版本历史、源组件更新乐观锁、引用页面扫描与过期预检保护</p><p>✓ 本地修改、跨网站访问、并发草稿变更与非法引用拦截</p><p>✓ 批量同步事务:第二个页面失败则整批草稿回滚,不直接修改发布页面</p><p>✓ HTTP + Worker 建站、构建、下载 ZIP 和预览;隔离 Chromium PC/手机交互演示</p></div><div class="warning"><b>尚未验证:</b>真实 PostgreSQL/Redis 多 Worker、正式 Docker 部署、线上 Agent/SFTP/S3 发布、官方 Art Design Pro 编译及登录后台后的浏览器 E2E。这些不属于本报告的通过项。</div><div class="card"><h2>分批回归明细</h2><table><thead><tr><th>批次</th><th>模块</th><th>通过用例</th><th>耗时(秒)</th><th>状态</th></tr></thead><tbody>{html_rows}</tbody></table></div><p>原始证据:<code>reports/v825-regression/batch-*.log</code>、<code>reports/v825-regression/result.json</code>。本报告不代表已经在正式客户网站上线。</p></main></body></html>'''
(ROOT/'reports'/'V8_25_验收报告.html').write_text(page,encoding='utf8')
print('Report:',total,'python tests across',len(rows),'batches; all_passed',all_ok)
if not all_ok:raise SystemExit(1)