维护记录

完成的工作

  • 拉取 origin/master 的 6 个新提交(fast-forward),工作树已同步 ✅
  • 应用户要求,优化工作流 #1(拆分 chore: auto-fix content 噪音 commit),其他建议(PR 预览、URL 稳定、Dependabot)不动 ✅
  • 实现 scripts/git-commit-push.ts 的自动 commit message 分类:
    • 5 个分类路径:rename / fm / format / covers / posts
    • 混合或无法识别时回退到 --message-fallback
  • 新增 --message-fallback 参数,deploy.yml 调用改为同时传 --message--message-fallback
  • 顶层 CLI 代码包到 isMain 守卫,避免被 import 时误执行(之前 import 会因 process.exit(1) 失败)
  • 新增 scripts/__tests__/git-commit-push.test.ts,13 个测试覆盖所有分类路径
  • 测试 + E2E dry-run 验证:rename 漂移 → chore(rename): sync post slugs (N files);fm 注入 → chore(fm): inject frontmatter (N files);混合 → fallback
  • 全部测试 164/164 通过,Hugo 构建 clean ✅

遇到的问题

  • 测试陷阱 1:git rename 检测对短文件失败 ⚠️
    • 最初测试 fixture 只写 10 行 body,git -M20% 阈值下也检测不出 rename
    • 实际 rename-posts.js 跑的都是 30+ 行文章,body 微调 < 20% 行
    • 解决:测试 fixture 加到 40 段,模拟真实文章密度
  • 测试陷阱 2:git mv vs 文件系统 mv ⚠️
    • 最初用 mv 改文件名 + writeFileSync 覆盖,git 不识别为 rename(变 A+D)
    • 解决:改用 git mv + 追加一行,模拟 rename-posts.js 真实操作
  • 测试陷阱 3:Apple Git 的 git rm 副作用 ⚠️
    • git rm 删除 tracked 文件后,git 2.x 会清理空目录
    • 后续 writeFileSync 写新 SVG 时 ENOENT
    • 解决:测试 setup 时预放 .gitkeep 占位文件
  • 模块化陷阱:顶层代码副作用 ⚠️
    • 把分类函数 export 给测试用后,import 时顶层 if (!message) process.exit(1) 会触发
    • 解决:用 pathToFileURL(process.argv[1]).href === import.meta.url 守卫 CLI 代码
  • 未用 import ⚠️
    • 测试文件 import 了 join from 'node:path',但实际用的是 Array.prototype.join
    • 自审时发现并清理,避免污染

决策点

  • 不改 sync-covers.yml 的调用方式:它只传 --message 不传 --message-fallback,新脚本会让 fallback = --message(原行为)。而且它的场景(cover IO)会被自动分类为 chore(covers): ...,永远走不到 fallback 分支。比之前更精确 ✅
  • 降级策略而非强制分类:当改动是"rename + 改了正文"或"fm 注入 + 新建 cover"这种混合,分类不可靠,返回 null 让 fallback 接住。不冒险乱分类

下次建议

  • 观察接下来几天的 auto-fix commit,如果 chore(rename) / chore(fm) 频繁出现,说明分类正确;如果大量 chore: auto-fix content (fallback) 出现,说明有分类逻辑没覆盖的场景,需要扩展
  • sync-covers.yml 也可以从 chore(assets): remove orphan cover images 升级到自动分类(会产出 chore(covers): -N cover image(s)),让两个 workflow 的 commit 风格统一

文件变更清单

  • 新增:scripts/__tests__/git-commit-push.test.ts(13 测试)
  • 修改:scripts/git-commit-push.ts(+196 行:isMain 守卫 + classifyStagedChanges + 子函数)
  • 修改:.github/workflows/deploy.yml(commit step 加 --message-fallback + 注释)