Commit Graph
22 Commits
Author SHA1 Message Date
wait4xandGLM-5.3 c4bdf46614 fix(ops): .mjs MIME 修复脚本——pdf.js worker 线上加载失败根因
线上 /_astro/pdf.worker.min.*.mjs 被 nginx 以 application/octet-stream
返回(mime.types 无 mjs 映射),浏览器拒绝以 module worker 加载 →
/papers/ 页 pdf.js 静默回落兜底卡;本地 python 测试床能猜对 MIME 故未
暴露。脚本幂等追加 mjs 到既有 javascript 映射行,-t 门禁+回滚+线上终验。

验证: bash -n 过;线上 worker 头实测 application/octet-stream(病根实证)

Spec: none (运维修复脚本)

Co-authored-by: GLM-5.3
2026-11-02 16:03:30 +08:00
wait4xandGLM-5.3 328ab68f18 feat(cms): 后台扩展五件——关于页 markdown 化/社交/头像/favicon/分轨首页
- T1 关于页=markdown 文档:about.yaml intro 扩为多段 markdown(zh/en),
  AboutPage 用 @astrojs/markdown-remark 的 createMarkdownProcessor(进程
  内单例复用)+ set:html 渲染,正文 p/ul/strong/a 对齐站点排版;名片与
  技能卡结构不动
- T2 社交链接单一数据源:home.yaml socials[](label/url/icon)+
  SocialLinks.astro(图标注册表白名单:github/rss/email/bilibili/x,
  未登记 icon 回退纯文字),首页 zh/en 内联硬编码社交块删除
- T3 头像与 favicon 可上传:schema avatar: image()(Astro Image 出 60px
  WebP,未设回退渐变 SVG);home.yaml favicon → BaseLayout link[rel=icon]
  按扩展名给 type,留空回退 /favicon.svg
- T4 首页分轨:PostList perTrack → 阅读轨/技术轨两段各限 6,各自出口
  (阅读→/books/ 技术→/archives/,en 同构);E2E 断言改为两段各≤6+各自
  出口+阅读在前
- T5 后台列表日期:posts summary「{{pubDate}} · {{title}}」、moments
  「{{fields.pubDate}} · {{fields.text}}」+sortable;photos 无 frontmatter
  日期(JSON sidecar)保持分组 · 标题并在文档写明原因
- 顺手修 content-lint 漏报:中文文件名在 HTML 里为 %XX 编码,脚本直接
  拼盘上路径导致 6 条"缺图"误报 → 加 decodeURI
- 清理:删除书封误传遗留的双重嵌套目录文件

车道:op-gitea(5/5,build+E2E 37/37+lint 47 页 0/0/0);收编复验:
build 46 页 + E2E 37/37 连跑(首跑两红为车道并发构建擦 dist 的瞬时态,
复跑绿)

验证: node v26.13.0 + astro 7.4.4 全量构建 46 页 exit 0;E2E 37/37;
      content-lint 0/0/0;books details/命令面板 playwright 实测

Spec: none (后台能力扩展,车道级交付)

Co-authored-by: GLM-5.3
2026-11-02 15:46:41 +08:00
wait4xandGLM-5.3 5be09b6f32 fix(admin): 后台后端改博客域同源反代——绕开 git 域 522
git.wait4x.online 公网 522(源站侧待查)卡死 Sveltia 登录。
config.yml backend 改 base_url=https://wait4x.online/gitea +
api_root=.../api/v1;新增运维脚本给博客 vhost 加 /gitea/ 反代
→127.0.0.1:13020(Host 伪 git 域、no-store、noindex;幂等+-t 门
禁+回滚+双口径终验)。同源后 CORS 问题一并消失。

验证: yaml 解析过;pnpm astro build;bash -n 过

Spec: none (后台可用性修复)

Co-authored-by: GLM-5.3
2026-11-02 11:18:35 +08:00
wait4xandGLM-5.3 de42fed52e fix(ops): /admin/ 404 修复脚本——location 块补 root
病根:博客 vhost 的 root 写在 location / 内(launch.sh 静态切换设
计),nginx 的 location 不向上继承 root,故后来加的 location
/admin/ 块落到默认根目录 → 404(用户打不开后台的直接原因)。
脚本幂等重写 admin 块(root+index+noindex 局部),-t 门禁+回滚+
双口径终验。

验证: bash -n 语法过;本地 dist/admin 三件齐全(config/index/js)

Spec: none (运维修复脚本)

Co-authored-by: GLM-5.3
2026-11-02 11:13:09 +08:00
wait4xandGLM-5.3 2b8353837a feat(ops): SEO 解封收尾脚本——default 混合文件逐块精确锚定
default 内四 server 块共存(三面板+博客),文件级 v3 脚本无法区
分;本脚本按各自 server_name 锚定:面板块补 noindex、博客块加
/admin/ 局部;幂等可重跑、备份出加载路径、nginx -t 失败回滚、
nginx -T 配置级终验(不受边缘缓存干扰)。

验证: bash -n 语法过;锚定正则对 default 实文件 server_name 四行
干跑(面板命中/博客精确/互不误中)

Spec: none (用户操作单自动化收尾件)

Co-authored-by: GLM-5.3
2026-11-01 11:17:45 +08:00
wait4xandGLM-5.3 3b65cc47ec fix(ops): seo-unblock v3 补——博客主站判定字符类修正
v2 残留:([[:space:]];|$) 被解析为空格+分号序列而非字符类,-x 兜底
吃行首缩进——admin location 两轮未落。统一 (^|[[:space:];]) 词边界
并显式排除 git 子域。

验证: bash -n 过;判定正则对 /etc/nginx/sites-enabled/default 实文件
干跑(博客行命中/git 行排除双验)

Spec: none (脚本热修 v3 补)

Co-authored-by: GLM-5.3
2026-11-01 11:16:21 +08:00
wait4xandGLM-5.3 ca7d71325c fix(ops): seo-unblock v3——补回判定反转名单制为 include 圈
v2 名单制漏 dpanel/ms365/ddns(同 default 文件 include snippet,剥
离后集体失守 noindex,实弹发现);v3 改凡 include esa-origin-ssl
且非博客主站一律补回,博客判定同步修正字符类。

验证: bash -n 语法过;判定正则对 default 实文件 server_name 复核

Spec: none (脚本热修 v3)

Co-authored-by: GLM-5.3
2026-11-01 11:16:03 +08:00
wait4xandGLM-5.3 d41fcc058c fix(ops): seo-unblock v2——备份出加载路径+主机判定精确 token
v1 实弹暴露两缺陷:①.bak-seo 备份留在 sites-enabled/ 内被 nginx
glob 加载→duplicate default server 全链崩;②grep -w 词边界点号
之误,git.wait4x.online 也被当博客主站注入 admin location。
v2:备份入 /tmp 专属目录+回滚后清理(含 v1 遗留)+server_name
精确 token 判定。

验证: bash -n 语法过;dry-run 计划段与判定正则复核

Spec: none (脚本热修:v1 事故根因双修)

Co-authored-by: GLM-5.3
2026-11-01 11:11:27 +08:00
wait4xandGLM-5.3 50c7595838 feat(ops): SEO 解封一键脚本——预览确认执行自检回滚五段式
nginx 侧全自动(snippet 剥离/内部 vhost 补回/admin 局部/失败回
滚/源站终验),ESA 三动作打印手动步骤;dry-run 先行+确认门。

验证: bash -n 语法过;dry-run 输出与 Phase 5f T1 操作单变更计划一致

Spec: none (用户操作单自动化,Phase 5f T1 收尾件)

Co-authored-by: GLM-5.3
2026-11-01 11:06:58 +08:00
wait4xandGLM-5.3 c307285a25 fix(i18n): localePath 三处双 en 一刀治+canonical 全量(blog-5f T2/T3 车道收编)
- T2:localePath 先归一 zh 再拼前缀(Header/CommandPalette/
  BaseLayout 三处 /en/en/ 同源病根一刀),返回值统一尾斜杠;
  BaseLayout 自指 canonical 全量 35 页;E2E 新增 en canonical
  自指断言(33→34)
- T3:content-lint.mjs 零依赖三检(断链 FAIL/缺图 FAIL/zh-en
  配对 WARN;CONTENT_LINT 逃生门;photos-originals 叠加层与
  /admin 单语两误报已修);prod-smoke.sh 三断言(robots 未落明
  确 FAIL 不静默);build.sh 守卫行挂载(smoke 对 staging 首版
  容忍,T1 robots 上线后转硬门,触发条件注释在案)
- tasks.md verify 字面量 33→34 联动同步(6 处)

车道:op-gitea(verify 六条实录);收编验收:E2E 34/34+产物零
/en/en/+lint 0/0/0 实跑复现

验证: node tests/e2e.mjs 34/34 PASS;! grep -r /en/en/ dist/;
      content-lint 三检 0 违例;bash -n+test -x 过

Spec: 2026-10-26_blog-5f

Co-authored-by: GLM-5.3
2026-11-01 09:12:01 +08:00
wait4xandGLM-5.3 3941a34f04 feat(pwa): SW 预缓存自动生成 + Sveltia 瞬间管理(池 4/5)
- gen-sw-precache.mjs post-build:按 dist 产物推导路由重写 dist/sw.js
  预缓存段(AUTO 标记锚定;规则=顶层+/en/ 轨深度≤1、/admin 永不入
  列)——新增顶层页自动进离线包,根治手工清单漏页维护债;实测 19
  路由含 moments 双轨、admin 排除
- build.sh 守卫挂钩(守卫先行纪律);sw.js 源内兜底清单保留
- Sveltia 加 moments 集合:随手发瞬间(text/image 可选+hint 自查条
  件必填、pubDate 日期件、tags、slug 日期模板)——管理后台从只管
  照片扩到内容面第一步

验证: 产物 sw 19 路由断言全过;E2E 33/33 PASS;yaml 解析过;bash -n 过

Spec: none (离线包自动化+后台扩容,车道级交付)

Co-authored-by: GLM-5.3
2026-10-26 20:02:32 +08:00
wait4xandGLM-5.3 0b6524f53c perf(home): 首屏 eager+关键 CSS 内联,Lighthouse 伪影根因修毕
- 车道 D 三件收编(op-gitea):①index.astro 首两图 eager+首图
  fetchpriority=high(Image 默认 lazy 曾压 LCP 至 6.4s,好模式现
  1.3s)②inline-home-css.mjs:BaseLayout 11KB 内联首页 head(省
  发现+下载跳)③build.sh 守卫挂钩
- 诊断结论入档:home 中位漂移根因=测试床伪影(python server 不压
  缩,裸传 67KB vs 生产 gzip 9.2KB;lantern 对未压缩 HTML 流式归因
  双峰 99↔165ms 翻转出两个世界)——gzip 等价口径中位 100
  (FCP 0.9-1.1s/LCP 1.3-1.4s/TBT 0/CLS 0)
- 测试床转正:gz-server.py 泛化入仓(ThreadingHTTPServer+gzip
  [端口 目录] 参数化)——兼治 SW 预缓存风暴竞速(单线程 server
  曾把 E2E /gallery/ networkidle 饿死,实锤于收编验收)
- E2E serviceWorkers:'block':SW 有专属测试,站点 E2E 求确定性
- 三连否定留档:SW✗/css链✗/子集内联 v3✗(6×63 反例钉死,已
  回滚)——残尾 20% 离群属 lantern trace 抖动,采中位+多轮

车道:op-gitea(过程三连否定+测试床移交);收编验收:内联 10KB
实出+首图 eager 实证+E2E 31/31(SW 屏蔽后确定性复现)

验证: gz 测试床 18743 gzip 10KB(生产等价口径);node tests/e2e.mjs
      31/31 PASS;构建+守卫链复跑

Spec: none (性能三件+测试床转正,车道级交付)

Co-authored-by: GLM-5.3
2026-10-25 21:37:38 +08:00
wait4xandGLM-5.3 1fdd0cc162 perf(build): 按页字体 CSS 子集化 + gallery 响应式图片阶梯
- subset-font-css.mjs post-build:扫每页文本(含 attr)+ ui.ts 全
  词条 + Latin/标点永保三防线,命中 unicode-range 才留 @font-face,
  子集按内容哈希去重共享,孤儿原 CSS 清出——全站字体 CSS 6.7→2.6MB
  (61%),mian-sha 声明 101→48/家族
- build.sh 挂载(存在性守卫:车道在途文件不断发布链——20:31 事故
  纪律)
- GalleryPage srcset 阶梯 320/560/720→480/800/1200(首图
  fetchpriority 维持)
- Lighthouse:mian-sha 61→78、gallery 74→79、en 70→83、terminal
  74→88(A11y/BP/SEO 持平;unused-css 370→36KB)
- 过程坑:v1 重写 href 丢前导斜杠致嵌套页 404——v2 只换文件名

车道:op-gitea(A/B 渲染等价证明:serif 916 字 0-miss;分数复采
入 /tmp/e2e-shots/lighthouse-ap/);收编验收:serif 字形
fonts.check 实测 true、srcset 产出、E2E 31/31

验证: pnpm astro build + subset 跑通 35 页;E2E 31/31 PASS;
      staging 部署后 stamp 复核

Spec: none (构建管线性能二连:post-build 子集化+图片阶梯)

Co-authored-by: GLM-5.3
2026-10-25 21:05:15 +08:00
wait4xandGLM-5.3 f8add5ad15 feat(deploy): 裸 clone 构建改造与 en/archives 补页(T1/T4)
- build.sh:构建源改 ~/docker_apps/blog/build-repo(fetch+reset 硬跟
  origin/main,匿名 fetch)——线上=远端 main 确定性闭环,Sveltia 保存
  即自动上线生效;stamp 记录构建 commit;node_modules 留仓内做增量
  (loader 逻辑变更时须清 node_modules/.astro——EXIF 教训已注)
- en/archives/index.astro 补缺(此前 404):PostList locale 复用 +
  译题映射;三级目录 import 深度坑再犯一次(已修)

验证: bash infra/deploy/build.sh → staging 29 html @0e792a7(裸 clone
      实测);build 本地 28+1 页;E2E 30/30 PASS

Spec: 2026-10-25_add-blog-5c

Co-authored-by: GLM-5.3
2026-10-25 19:23:40 +08:00
wait4xandGLM-5.3 7a2880b65d fix(polish): 上线四缺陷修复——明暗委托/灯箱常开/评论站点名/书评宋体
- 明暗切换:document 级委托(软导航换 DOM 后元素级监听全丢);
  E2E 再抓一坑:SVGElement 非 HTMLElement 实例,守卫用 Element 基类
- 图库:#lb 无条件 display:flex 覆盖 UA 隐藏 → 灯箱"永远打开"盖全页;
  改 #lb:not([open]) 显式 none;时间戳标题清空;灯箱打磨(切换钮
  实底阴影/n/21 计数器/空标题隐藏/原图链接暗底亮蓝)
- 评论:site 'wait4x'→'wait4x.online' 对齐 Artalk 服务端(404 根因)
- 书评字体:文楷→思源宋(@fontsource 预分片);文楷降级金句 --font-kai
- 数据:21 张照片组修正 street→landscape(迁移器收到内部组 id 的坑)
- 新增 tests/e2e.mjs:Playwright 30 项全功能 E2E

验证: node tests/e2e.mjs 30/30 PASS(含软导航后明暗切换回归项)

Spec: 2026-10-25_fix-site-polish

Co-authored-by: GLM-5.3
2026-10-25 10:46:03 +08:00
wait4xandGLM-5.3 fb97d76ddb feat(launch): 命令面板+预发布验收+上线脚本(T1/T4/T5)
- T1 (op-gitea 车道):CommandPalette 三层(动作 theme/lang/rss+导航
  zh/en+Pagefind 搜索),Ctrl K 与 / 入口,document 级委托修 ClientRouter
  换页绑定失效;连带修复动态结果节点的 scoped CSS 失效潜伏 bug
- T4:preflight.sh 17 项全绿(产物/hreflang/双轨/微信 UA 200/
  responsive 11/halo 无恙/回滚前置);headless 渲染经 c4ai 复核
  (en 书评页全文+标注+ICP 实测在案)
- T5:launch.sh/rollback.sh 双向 dry-run 绿 + 上线检查单(linger/
  ESA 刷新/验证 URL/回滚路径)

验证: build 21 页 exit 0;command-palette+cmd-item zh/en 断言;
      bash scripts/preflight.sh ALL OK;launch/rollback dry-run exit 0

Spec: 2026-10-25_add-blog-launch
Co-authored-by: GLM-5.3
2026-10-25 09:52:50 +08:00
wait4xandGLM-5.3 e185a292c8 feat(i18n): T6 真实翻译入仓与 Phase 3 收敛归档
- op-artalk 车道:6/6 篇 TMT 翻译入 posts-en(frontmatter 字节级透传),
  幂等复跑 0 API;修复 TMT 1800+ 字符包静默截断(limit 1600 + ratio
  检测 + 二分降级,mock 三场景)
- 标题首字母抛光;T8 staging 21 页 + rollback 绿 + halo 无恙
- spec_verify --all 八项同指纹 exit=0;check 一次收敛;归档

验证: 21 页 build exit 0;/en/ 文章页真实英文内容渲染
      (Under the Veil… 抽检);幂等 dry-run 6 skip 0 API

Spec: 2026-10-25_add-blog-i18n
Co-authored-by: GLM-5.3
2026-10-25 09:40:59 +08:00
wait4xandGLM-5.3 44bfb23efb feat(gallery): 原图查看与下载——仓外 originals store 双轨制
- git 仓只进压缩版(构建用);原图落 ~/docker_apps/blog/photos-originals/
  (迁移器/ingest 双入口写入,幂等),build.sh 独立 rsync 到
  staging/photos-originals/(同一静态根,零 nginx 改动)
- lightbox 增「原图」(新标签全尺寸)+「下载」(download 属性带文件名)
- 原图持久保障:store + Phase 0 备份 tar 双留档;存量 21 张已回填(196M)

验证: astro build 11 页 exit 0;dist/gallery 含 lb-original×2 与
      photos-originals 引用;staging/photos-originals 21 张实测

Spec: none (用户功能补req:原图查看/下载,跨 Phase 独立小特性)

Co-authored-by: GLM-5.3
2026-10-25 09:12:26 +08:00
wait4xandGLM-5.3 382e56431f fix(photos): 入库压缩保留 EXIF 并补未来上传的压缩缺口
- 迁移器与新增 photos_ingest.py 压缩时显式 exif= 传参(PIL 重存默认
  剥离——此前 21 张已全部丢 EXIF,图库参数条构建期数据源被抽空)
- exif=None 会使 PIL JPEG 保存 len(None) 崩,改条件传参
- photos_ingest.py:幂等入库处理器(长边 2400/q86,>1.5M 才动),
  堵住 gitea/本地上传原图直入仓的缺口(196M 事故成因)
- 重跑迁移:19/21 带 EXIF(2 张原图本无),体积 9.7M

验证: pnpm astro build 11 页 exit 0;EXIF 保留计数 19/21

Spec: none (Phase 2 归档后的独立小修:EXIF 修复 + ingest 补缺)

Co-authored-by: GLM-5.3
2026-10-25 09:01:07 +08:00
wait4xandGLM-5.3 aea21c8694 feat(migrate): Halo 全量内容迁移(压缩版)——6文/21图/1瞬间 URL 1:1
- 正文源=线上渲染页(Halo 快照层 patch 残迹:泥潭/赎罪仅 2 字符),
  pandoc html→gfm + tags API 显示名换算后分类:5 书评(五档情绪色)+1 技术
- 图库 21 张:长边 2400/q86 压缩入仓(原图 196M→9.5M——公开仓历史膨胀
  与 nginx 100M 推送上限双杀;原图在 Phase 0 备份 tar 中永久留档)
- 瞬间 1 条;URL 1:1(6 slug 全等,零 301)
- 本提交由 7 个本地提交重写而成(清除已进历史的 196M blob,未推送过);
  因 reset --soft 暂存竞态,一并包含 spec 归档文件
  (.spec/specs/archive/2026-10-24_migrate-blog-content/)

验证: check_urls.py 6==6;astro build 11 页 exit 0(8.67s);
      EXIF 管线跑通;staging 更新;halo healthy+200 全程未动

Co-authored-by: GLM-5.3
2026-10-25 00:39:08 +08:00
wait4xandGLM-5.3 945a9ee610 feat(pages): 五页型落地——首页/文章双模板/图库 masonry/瞬间/关于
- 首页:名片+身份陈述空槽+按年分组分轨列表(情绪色/mono标签)+影像格+项目墙
- 文章 /archives/{slug}(与 Halo 旧 URL 1:1):reading→衬线纸墨 / tech→
  TOC 侧栏(≥1120 sticky)+2px 进度条+Artalk 容器占位
- 图库:grid masonry(构建期 aspect-ratio 零 JS)+原生 dialog lightbox
  (←→/Esc+EXIF 底栏)+分组筛选
- 瞬间时间线 / 关于(三轨版图+构建说明)
- sharp ^0.35.5 入依赖(Astro 7 不内置,astro:assets 缩略图管线前提)
- 裸 blockquote 默认吃 A 墨线样式(markdown 原生输出无类名的缝隙)
- 车道 30min 超时,产物完整,主会话补 sharp+断言脚本递归修正后收编

验证: pnpm astro build exit 0(7 页);五路由产物断言过;
      scripts/check-responsive.sh 11/11 ok(1120/820/760/560 全档)

Spec: 2026-10-24_add-blog-skeleton
Co-authored-by: GLM-5.3
2026-10-25 00:11:34 +08:00
wait4xandGLM-5.3 80ff67e8fa feat(content): 三集合 schema 与 EXIF 构建期补全(T4 车道收编)
- src/content.config.ts(Astro 7 唯一合法路径,旧 config.ts 会抛
  LegacyContentConfigError——车道实测发现,经批复的边界修正)
- posts(category→track 派生单源)/moments(text-image 互斥 refine)/
  photos(json sidecar + jpg,exif 构建期 exifr 补全、frontmatter 可覆盖)
- 样例:书评+技术文各 1、瞬间 3、照片 3(横竖方三比例,EXIF 三路径覆盖)
- 附带 scripts/check-responsive.sh(T9 预置,随 T6 产物生效)
- 车道 30min 超时于过度验证循环,产物完好,主会话收编续跑

验证: pnpm astro build exit 0(1.63s,含三集合加载)

Spec: 2026-10-24_add-blog-skeleton
Co-authored-by: GLM-5.3
2026-10-24 23:36:59 +08:00