upgrade: adopt V8.21.3 (V8.13→8.21.3: P5 SFTP/S3, P6 multilingual, editor overhaul, enterprise hardening)

Overlay ~150 upstream items onto our V8.12 base, preserving trade-pro
theme, registry tests, and design docs. Re-applied our patch set
(discovery/env_for/blocks.css/type-mapping/theme_color/frontend entries,
test_theme_pro_v3 mods) — all anchors survived upstream evolution.

New platform enhancement (fixes upgrade-introduced regression):
multilingual.site_locale now honors settings_json.locale, plus
PUT /api/i18n/sites/{id}/locale — standalone English sites get
<html lang='en'> under the V8.15 locale-rewrite pipeline.

compose: adopt V8.21.3 (image 8.21.3-dev.1, /api/ready probes, MySQL/S3
env) with project name pinned to siteforge-v8-10 (data volumes).

Tests: 356 passed / 11 failed — all 11 confirmed pre-existing in
pristine V8.21.3 on this host (10 upstream Windows env + our build test
now green after locale fix). Patch registry updated in plan doc.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-10-23 12:31:03 +08:00
parent 257c89e159
commit 601451f22b
218 changed files with 10441 additions and 628 deletions
@@ -0,0 +1,2 @@
<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>V8.21.3 移动端四套主题验收报告</title><style>
:root{--ink:#1c3045;--muted:#66768b;--line:#e1e8ee;--accent:#e8883c}*{box-sizing:border-box}body{margin:0;background:#edf1f5;font:14px/1.65 system-ui,"Microsoft Yahei",sans-serif;color:var(--ink)}main{max-width:1050px;margin:0 auto;padding:44px 25px 75px}h1{font-size:29px;letter-spacing:-.6px;margin:2px 0 14px}h2{font-size:19px;margin:30px 0 12px}p{color:var(--muted)}.pill{display:inline-flex;border:1px solid #e6c19c;background:#fff5e8;color:#a35b23;border-radius:40px;padding:4px 10px;font-weight:700;font-size:11px}.cards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}.card{background:white;border:1px solid var(--line);border-radius:14px;padding:20px}.big{font-size:34px;font-weight:800;letter-spacing:-1px}.sub{color:var(--muted);font-size:12px}.panel{background:white;border:1px solid var(--line);border-radius:14px;padding:22px}table{border-collapse:collapse;width:100%;font-size:13px}td,th{padding:13px 12px;border-bottom:1px solid var(--line);text-align:left}th{color:var(--muted);font-weight:650;background:#f7f9fb}tr:last-child td{border:0}.ok{color:#167c55;font-weight:700}.notes li{margin-bottom:7px}a{color:#2666a7}.split{display:grid;grid-template-columns:230px 1fr;gap:22px;align-items:start}img{width:100%;border-radius:9px;border:1px solid var(--line)}@media(max-width:650px){.cards{grid-template-columns:1fr}.split{grid-template-columns:1fr}main{padding:22px 14px}table{display:block;overflow:auto}}</style></head><body><main><span class="pill">SiteForge Enterprise · 8.21.3-dev.1</span><h1>四套主题移动端与抽屉导航验收</h1><p>真实源码集成版 · 自动化测试与离线 Chromium 实测 · 2026-10-23</p><div class="cards"><div class="card"><div class="sub">Python 全量回归</div><div class="big">346</div><div class="sub">41 个测试模块 · 0 失败</div></div><div class="card"><div class="sub">四套内置主题</div><div class="big">4/4</div><div class="sub">抽屉菜单和可选底部 Tabs 通过</div></div><div class="card"><div class="sub">手机布局组合</div><div class="big">48</div><div class="sub">4 主题 × 4 页面类型 × 3 宽度</div></div></div><h2>主题及布局检查</h2><div class="panel"><table><thead><tr><th>主题</th><th>页面类型</th><th>手机宽度</th><th>水平溢出</th><th>结果</th></tr></thead><tbody><tr><td>汽车主题</td><td>4 类页面</td><td>375 / 390 / 430px</td><td>0px</td><td><span class="ok">通过</span></td></tr><tr><td>建材主题</td><td>4 类页面</td><td>375 / 390 / 430px</td><td>0px</td><td><span class="ok">通过</span></td></tr><tr><td>企业主题</td><td>4 类页面</td><td>375 / 390 / 430px</td><td>0px</td><td><span class="ok">通过</span></td></tr><tr><td>简约主题</td><td>4 类页面</td><td>375 / 390 / 430px</td><td>0px</td><td><span class="ok">通过</span></td></tr></tbody></table></div><h2>交互逻辑</h2><div class="panel"><div class="split"><img alt="汽车主题移动端示意截图" src="mobile-v8213-automotive.png"><div><ul class="notes"><li>手机右侧抽屉导航,多级目录可展开;支持遮罩、关闭按钮、Esc、焦点返回与滚动锁定。</li><li>手机底部 Tabs 默认关闭;可以从后台添加 1–5 个入口,并编辑文字、图标、顺序、链接。</li><li>可配置站内页面、HTTPS(WhatsApp 等)、拨号、邮箱,或“打开导航菜单”操作。</li><li>桌面版不显示手机底栏;已有导航和页脚保留。</li><li>配置先保存草稿,发布后在下一次静态构建中生效,不直接更新线上站点。</li></ul><p><a href="../examples/mobile-showcase/index.html">打开四套主题离线互动预览</a> · <a href="v8213-final-regression.html">分批回归原始报告</a></p></div></div></div><h2>验收限制</h2><div class="panel"><p>Chromium 通过 <code>page.set_content</code> 对真实 HTML、CSS、JavaScript 模板离线渲染,以适配运行环境对 file:// 和 localhost 导航的限制;图片使用示例数据。并非真实线上网站、CDN、iOS Safari 或 Android 真机验收。</p><p>本次覆盖四套内置专业主题的四种代表性页面,不代表所有页面、所有设备或额外安装的第三方主题均已逐一审核。Art Design Pro 官方工程和 PostgreSQL/Redis 生产验收仍需独立完成。</p><p>技术文档:<code>docs/V8_21_3_MOBILE_THEMES.md</code>;原始浏览器日志:<code>reports/mobile-v8213-browser.json</code>。</p></div></main></body></html>
+10
View File
@@ -0,0 +1,10 @@
# SiteForge V8.21.3 移动端四套主题验收报告
- 版本:8.21.3-dev.1
- 全量回归:346 项通过 / 41 模块,11 个隔离批次,0 失败
- Chromium:汽车、建材、企业、简约四主题抽屉和 Tabs 实测通过,0 JS 错误
- 布局:4 套主题 × 4 页面类型 × 3 手机宽度 = 48 组合,0px 横向溢出
- HTTP/Worker:登录、CSRF、建站、构建、ZIP、预览通过
- 真实 iOS/Android、域名部署、第三方主题、正式 Art/PG/Redis 未验收
详见 docs/V8_21_3_MOBILE_THEMES.md 和 reports/v8213-final-regression.json。
Binary file not shown.

After

Width:  |  Height:  |  Size: 255 KiB

+38
View File
@@ -0,0 +1,38 @@
[
{
"theme": "automotive",
"drawer": "PASS",
"tabs": "PASS",
"responsive": "PASS",
"mobile_horizontal_overflow_px": 0,
"page_types_tested": 4,
"javascript_errors": 0
},
{
"theme": "industrial",
"drawer": "PASS",
"tabs": "PASS",
"responsive": "PASS",
"mobile_horizontal_overflow_px": 0,
"page_types_tested": 4,
"javascript_errors": 0
},
{
"theme": "corporate",
"drawer": "PASS",
"tabs": "PASS",
"responsive": "PASS",
"mobile_horizontal_overflow_px": 0,
"page_types_tested": 4,
"javascript_errors": 0
},
{
"theme": "minimal",
"drawer": "PASS",
"tabs": "PASS",
"responsive": "PASS",
"mobile_horizontal_overflow_px": 0,
"page_types_tested": 4,
"javascript_errors": 0
}
]
+1
View File
@@ -0,0 +1 @@
<!doctype html><html lang="zh-CN"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>V8.21 回归报告</title><style>body{font:15px/1.7 system-ui,sans-serif;background:#f2f5f8;padding:25px}main{max-width:950px;margin:auto;background:white;padding:28px;border-radius:14px}table{width:100%;border-collapse:collapse}th,td{padding:10px;border-bottom:1px solid #dde2e7;text-align:left}</style><main><h1>SiteForge V8.21 回归验收</h1><h2>PASS</h2><p>每轮 346 项自动化测试 · 1 轮 · 无外部环境实测保证</p><table><tr><th>批次</th><th>结果</th><th>通过</th><th>秒数</th></tr><tr><td>round1-batch1</td><td>PASS</td><td>43</td><td>5.12</td></tr><tr><td>round1-batch2</td><td>PASS</td><td>22</td><td>6.14</td></tr><tr><td>round1-batch3</td><td>PASS</td><td>50</td><td>9.34</td></tr><tr><td>round1-batch4</td><td>PASS</td><td>28</td><td>4.66</td></tr><tr><td>round1-batch5</td><td>PASS</td><td>29</td><td>6.06</td></tr><tr><td>round1-batch6</td><td>PASS</td><td>25</td><td>4.44</td></tr><tr><td>round1-batch7</td><td>PASS</td><td>51</td><td>8.35</td></tr><tr><td>round1-batch8</td><td>PASS</td><td>18</td><td>3.31</td></tr><tr><td>round1-batch9</td><td>PASS</td><td>29</td><td>6.98</td></tr><tr><td>round1-batch10</td><td>PASS</td><td>41</td><td>6.22</td></tr><tr><td>round1-batch11</td><td>PASS</td><td>10</td><td>3.31</td></tr></table><p>请参阅 JSON、Markdown 和原始测试日志。真实客户站点迁移仍需专项验收。</p></main></html>
+163
View File
@@ -0,0 +1,163 @@
{
"version": "8.21.3-dev.1",
"generated_at": "2026-10-23T03:23:52.298283+00:00",
"status": "PASS",
"test_modules": 41,
"repeats": 1,
"tests_per_round": 346,
"total_passes": 346,
"batches": [
{
"status": "PASS",
"passed": 43,
"duration_seconds": 5.12,
"exit_code": 0,
"name": "round1-batch1",
"modules": [
"tests/test_commercial_v5.py",
"tests/test_connectors_v84.py",
"tests/test_connectors_v85.py",
"tests/test_console_v819.py"
],
"log": "reports/v8213-final-regression_logs/round1-batch1.log"
},
{
"status": "PASS",
"passed": 22,
"duration_seconds": 6.14,
"exit_code": 0,
"name": "round1-batch2",
"modules": [
"tests/test_core_v4.py",
"tests/test_editor_easy_v8212.py",
"tests/test_editor_ux_v8211.py",
"tests/test_enterprise.py"
],
"log": "reports/v8213-final-regression_logs/round1-batch2.log"
},
{
"status": "PASS",
"passed": 50,
"duration_seconds": 9.34,
"exit_code": 0,
"name": "round1-batch3",
"modules": [
"tests/test_enterprise_v7.py",
"tests/test_factory.py",
"tests/test_factory_v2.py",
"tests/test_mobile_tabs_v8213.py"
],
"log": "reports/v8213-final-regression_logs/round1-batch3.log"
},
{
"status": "PASS",
"passed": 28,
"duration_seconds": 4.66,
"exit_code": 0,
"name": "round1-batch4",
"modules": [
"tests/test_multilingual_v815.py",
"tests/test_p0_71.py",
"tests/test_p0_backup.py",
"tests/test_p0_p4_completion_v88.py"
],
"log": "reports/v8213-final-regression_logs/round1-batch4.log"
},
{
"status": "PASS",
"passed": 29,
"duration_seconds": 6.06,
"exit_code": 0,
"name": "round1-batch5",
"modules": [
"tests/test_p0_p4_completion_v89.py",
"tests/test_p1_platform.py",
"tests/test_production_v816.py",
"tests/test_professional_ui_v811.py"
],
"log": "reports/v8213-final-regression_logs/round1-batch5.log"
},
{
"status": "PASS",
"passed": 25,
"duration_seconds": 4.44,
"exit_code": 0,
"name": "round1-batch6",
"modules": [
"tests/test_regression_runner_v817.py",
"tests/test_release_native_v814.py",
"tests/test_release_reviews_v7.py",
"tests/test_release_v813.py"
],
"log": "reports/v8213-final-regression_logs/round1-batch6.log"
},
{
"status": "PASS",
"passed": 51,
"duration_seconds": 8.35,
"exit_code": 0,
"name": "round1-batch7",
"modules": [
"tests/test_site_design_v87.py",
"tests/test_siteforge_v817_audit.py",
"tests/test_studio_v86.py",
"tests/test_theme_pro_v3.py"
],
"log": "reports/v8213-final-regression_logs/round1-batch7.log"
},
{
"status": "PASS",
"passed": 18,
"duration_seconds": 3.31,
"exit_code": 0,
"name": "round1-batch8",
"modules": [
"tests/test_v818_pg_recovery.py",
"tests/test_v818_sqlite_pg_transfer.py",
"tests/test_v821_editor_history_and_mapping.py",
"tests/test_v8_art_installer.py"
],
"log": "reports/v8213-final-regression_logs/round1-batch8.log"
},
{
"status": "PASS",
"passed": 29,
"duration_seconds": 6.98,
"exit_code": 0,
"name": "round1-batch9",
"modules": [
"tests/test_v8_workflows.py",
"tests/test_wordpress_baseline.py",
"tests/test_worker_queue_v6.py",
"tests/test_workspace_v810.py"
],
"log": "reports/v8213-final-regression_logs/round1-batch9.log"
},
{
"status": "PASS",
"passed": 41,
"duration_seconds": 6.22,
"exit_code": 0,
"name": "round1-batch10",
"modules": [
"tests/test_workspace_v812.py",
"tests/test_wp_complex_v820.py",
"tests/test_wp_migration_v81.py",
"tests/test_wp_migration_v82.py"
],
"log": "reports/v8213-final-regression_logs/round1-batch10.log"
},
{
"status": "PASS",
"passed": 10,
"duration_seconds": 3.31,
"exit_code": 0,
"name": "round1-batch11",
"modules": [
"tests/test_wp_migration_v83.py"
],
"log": "reports/v8213-final-regression_logs/round1-batch11.log"
}
],
"environment_note": "pytest local fixtures only; Docker/PG/Redis/browser/real WordPress not inferred as passed."
}
+19
View File
@@ -0,0 +1,19 @@
# SiteForge V8.21 完整自动化回归
**PASS** — 41 模块 / 346 项每轮 / 1 轮
| 批次 | 结果 | 通过用例 | 耗时 | 日志 |
|---|---|---:|---:|---|
| round1-batch1 | PASS | 43 | 5.12 秒 | reports/v8213-final-regression_logs/round1-batch1.log |
| round1-batch2 | PASS | 22 | 6.14 秒 | reports/v8213-final-regression_logs/round1-batch2.log |
| round1-batch3 | PASS | 50 | 9.34 秒 | reports/v8213-final-regression_logs/round1-batch3.log |
| round1-batch4 | PASS | 28 | 4.66 秒 | reports/v8213-final-regression_logs/round1-batch4.log |
| round1-batch5 | PASS | 29 | 6.06 秒 | reports/v8213-final-regression_logs/round1-batch5.log |
| round1-batch6 | PASS | 25 | 4.44 秒 | reports/v8213-final-regression_logs/round1-batch6.log |
| round1-batch7 | PASS | 51 | 8.35 秒 | reports/v8213-final-regression_logs/round1-batch7.log |
| round1-batch8 | PASS | 18 | 3.31 秒 | reports/v8213-final-regression_logs/round1-batch8.log |
| round1-batch9 | PASS | 29 | 6.98 秒 | reports/v8213-final-regression_logs/round1-batch9.log |
| round1-batch10 | PASS | 41 | 6.22 秒 | reports/v8213-final-regression_logs/round1-batch10.log |
| round1-batch11 | PASS | 10 | 3.31 秒 | reports/v8213-final-regression_logs/round1-batch11.log |
真实部署与外部服务另行验收。
+1
View File
@@ -0,0 +1 @@
<!doctype html><html lang="zh-CN"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>V8.21 回归报告</title><style>body{font:15px/1.7 system-ui,sans-serif;background:#f2f5f8;padding:25px}main{max-width:950px;margin:auto;background:white;padding:28px;border-radius:14px}table{width:100%;border-collapse:collapse}th,td{padding:10px;border-bottom:1px solid #dde2e7;text-align:left}</style><main><h1>SiteForge V8.21 回归验收</h1><h2>PASS</h2><p>每轮 345 项自动化测试 · 1 轮 · 无外部环境实测保证</p><table><tr><th>批次</th><th>结果</th><th>通过</th><th>秒数</th></tr><tr><td>round1-batch1</td><td>PASS</td><td>43</td><td>5.03</td></tr><tr><td>round1-batch2</td><td>PASS</td><td>22</td><td>6.43</td></tr><tr><td>round1-batch3</td><td>PASS</td><td>49</td><td>8.64</td></tr><tr><td>round1-batch4</td><td>PASS</td><td>28</td><td>4.91</td></tr><tr><td>round1-batch5</td><td>PASS</td><td>29</td><td>5.82</td></tr><tr><td>round1-batch6</td><td>PASS</td><td>25</td><td>4.51</td></tr><tr><td>round1-batch7</td><td>PASS</td><td>51</td><td>8.36</td></tr><tr><td>round1-batch8</td><td>PASS</td><td>18</td><td>3.14</td></tr><tr><td>round1-batch9</td><td>PASS</td><td>29</td><td>6.99</td></tr><tr><td>round1-batch10</td><td>PASS</td><td>41</td><td>6.29</td></tr><tr><td>round1-batch11</td><td>PASS</td><td>10</td><td>3.12</td></tr></table><p>请参阅 JSON、Markdown 和原始测试日志。真实客户站点迁移仍需专项验收。</p></main></html>
+163
View File
@@ -0,0 +1,163 @@
{
"version": "8.21.3-dev.1",
"generated_at": "2026-10-23T03:21:40.077265+00:00",
"status": "PASS",
"test_modules": 41,
"repeats": 1,
"tests_per_round": 345,
"total_passes": 345,
"batches": [
{
"status": "PASS",
"passed": 43,
"duration_seconds": 5.03,
"exit_code": 0,
"name": "round1-batch1",
"modules": [
"tests/test_commercial_v5.py",
"tests/test_connectors_v84.py",
"tests/test_connectors_v85.py",
"tests/test_console_v819.py"
],
"log": "reports/v8213-regression_logs/round1-batch1.log"
},
{
"status": "PASS",
"passed": 22,
"duration_seconds": 6.43,
"exit_code": 0,
"name": "round1-batch2",
"modules": [
"tests/test_core_v4.py",
"tests/test_editor_easy_v8212.py",
"tests/test_editor_ux_v8211.py",
"tests/test_enterprise.py"
],
"log": "reports/v8213-regression_logs/round1-batch2.log"
},
{
"status": "PASS",
"passed": 49,
"duration_seconds": 8.64,
"exit_code": 0,
"name": "round1-batch3",
"modules": [
"tests/test_enterprise_v7.py",
"tests/test_factory.py",
"tests/test_factory_v2.py",
"tests/test_mobile_tabs_v8213.py"
],
"log": "reports/v8213-regression_logs/round1-batch3.log"
},
{
"status": "PASS",
"passed": 28,
"duration_seconds": 4.91,
"exit_code": 0,
"name": "round1-batch4",
"modules": [
"tests/test_multilingual_v815.py",
"tests/test_p0_71.py",
"tests/test_p0_backup.py",
"tests/test_p0_p4_completion_v88.py"
],
"log": "reports/v8213-regression_logs/round1-batch4.log"
},
{
"status": "PASS",
"passed": 29,
"duration_seconds": 5.82,
"exit_code": 0,
"name": "round1-batch5",
"modules": [
"tests/test_p0_p4_completion_v89.py",
"tests/test_p1_platform.py",
"tests/test_production_v816.py",
"tests/test_professional_ui_v811.py"
],
"log": "reports/v8213-regression_logs/round1-batch5.log"
},
{
"status": "PASS",
"passed": 25,
"duration_seconds": 4.51,
"exit_code": 0,
"name": "round1-batch6",
"modules": [
"tests/test_regression_runner_v817.py",
"tests/test_release_native_v814.py",
"tests/test_release_reviews_v7.py",
"tests/test_release_v813.py"
],
"log": "reports/v8213-regression_logs/round1-batch6.log"
},
{
"status": "PASS",
"passed": 51,
"duration_seconds": 8.36,
"exit_code": 0,
"name": "round1-batch7",
"modules": [
"tests/test_site_design_v87.py",
"tests/test_siteforge_v817_audit.py",
"tests/test_studio_v86.py",
"tests/test_theme_pro_v3.py"
],
"log": "reports/v8213-regression_logs/round1-batch7.log"
},
{
"status": "PASS",
"passed": 18,
"duration_seconds": 3.14,
"exit_code": 0,
"name": "round1-batch8",
"modules": [
"tests/test_v818_pg_recovery.py",
"tests/test_v818_sqlite_pg_transfer.py",
"tests/test_v821_editor_history_and_mapping.py",
"tests/test_v8_art_installer.py"
],
"log": "reports/v8213-regression_logs/round1-batch8.log"
},
{
"status": "PASS",
"passed": 29,
"duration_seconds": 6.99,
"exit_code": 0,
"name": "round1-batch9",
"modules": [
"tests/test_v8_workflows.py",
"tests/test_wordpress_baseline.py",
"tests/test_worker_queue_v6.py",
"tests/test_workspace_v810.py"
],
"log": "reports/v8213-regression_logs/round1-batch9.log"
},
{
"status": "PASS",
"passed": 41,
"duration_seconds": 6.29,
"exit_code": 0,
"name": "round1-batch10",
"modules": [
"tests/test_workspace_v812.py",
"tests/test_wp_complex_v820.py",
"tests/test_wp_migration_v81.py",
"tests/test_wp_migration_v82.py"
],
"log": "reports/v8213-regression_logs/round1-batch10.log"
},
{
"status": "PASS",
"passed": 10,
"duration_seconds": 3.12,
"exit_code": 0,
"name": "round1-batch11",
"modules": [
"tests/test_wp_migration_v83.py"
],
"log": "reports/v8213-regression_logs/round1-batch11.log"
}
],
"environment_note": "pytest local fixtures only; Docker/PG/Redis/browser/real WordPress not inferred as passed."
}
+19
View File
@@ -0,0 +1,19 @@
# SiteForge V8.21 完整自动化回归
**PASS** — 41 模块 / 345 项每轮 / 1 轮
| 批次 | 结果 | 通过用例 | 耗时 | 日志 |
|---|---|---:|---:|---|
| round1-batch1 | PASS | 43 | 5.03 秒 | reports/v8213-regression_logs/round1-batch1.log |
| round1-batch2 | PASS | 22 | 6.43 秒 | reports/v8213-regression_logs/round1-batch2.log |
| round1-batch3 | PASS | 49 | 8.64 秒 | reports/v8213-regression_logs/round1-batch3.log |
| round1-batch4 | PASS | 28 | 4.91 秒 | reports/v8213-regression_logs/round1-batch4.log |
| round1-batch5 | PASS | 29 | 5.82 秒 | reports/v8213-regression_logs/round1-batch5.log |
| round1-batch6 | PASS | 25 | 4.51 秒 | reports/v8213-regression_logs/round1-batch6.log |
| round1-batch7 | PASS | 51 | 8.36 秒 | reports/v8213-regression_logs/round1-batch7.log |
| round1-batch8 | PASS | 18 | 3.14 秒 | reports/v8213-regression_logs/round1-batch8.log |
| round1-batch9 | PASS | 29 | 6.99 秒 | reports/v8213-regression_logs/round1-batch9.log |
| round1-batch10 | PASS | 41 | 6.29 秒 | reports/v8213-regression_logs/round1-batch10.log |
| round1-batch11 | PASS | 10 | 3.12 秒 | reports/v8213-regression_logs/round1-batch11.log |
真实部署与外部服务另行验收。