海边

2026-08-22

维护记录

完成的工作

  • 删除 layouts/partials/footer.html(1 行 wrapper)
  • 删除 layouts/partials/custom_footer.html(156 行,PaperMod footer 的本地 fork)
  • 删除 hugo.toml 中 [params.cloudflareAnalytics] 配置块
  • Hugo --minify 构建通过,确认 Cloudflare Web Analytics 注入消失(cf-beacon 匹配 0 次),PaperMod 自带 footer 功能保留(top-link / scroll-to-top JS / 版权 / Powered by)

决策

  • 移除 Cloudflare 站点统计:custom_footer.html 相对于 PaperMod 原版 footer 唯一真正的差异就是 Cloudflare beacon 注入;既然没用价值,把 footer 部分整体还原回 PaperMod 默认,避免 PaperMod 升级 footer 时本地 fork 不同步的问题(2026-08-01 已记录此风险)
  • 保留 layouts/_partials/cover.html:该 override 解决了 PaperMod resources.ByType "image" 不识别 SVG 封面导致 404 的问题,不能删

下次建议

  • 如果以后又想加自定义站点统计,可以直接在 Hugo 配置启用内置埋点,或 inline 在 layouts/partials/extend_footer.html(PaperMod 已留 hook),不需要再 fork 整个 footer

维护记录

完成的工作

  • 修正 CLAUDE.md 中 prettier 安装命令的事实错误:实际是 deno install -g -A npm:prettier@3.9.6 落到 ~/.deno/bin/,不需要 setup-node
  • 修正 scripts/format-markdown.ts 顶部 docstring 的过时描述
  • 给 check-dead-links.yml / test-scripts.yml / validate-posts.yml 三个 push-trigger workflow 加上 if: github.actor != 'github-actions[bot]' 守卫,跟 deploy.yml / sync-covers.yml / update-papermod.yml 一致;节省 bot 推送后再次触发 CI 的时间
  • 删除 assets/images/covers/covers/ 死目录(220 个 SVG,5.4MB):该批封面是 2026-07-21 第一次批量生成时落在 assets/images/covers/ 的;后来 gen-covers.ts 的 COVERS_DIR 改成 static/images/covers/,但旧的没清;grep 确认没有任何 .ts / .md / .yml / .toml 引用该路径

下次建议

  • 第三方 action 仍用浮动 tag(@v4/@v3/@v2);可考虑钉 SHA 防供应链投毒
  • format-markdown.ts(27 行)/ optimize-images.ts(182 行) 仍无单测

维护记录

完成的工作

  • 删除全部 31 篇文章中的 categories: 字段(都是 inline categories: ["X"] 格式)— 决定只用 tag 做分类
  • hugo.toml 的 [taxonomies] 中删掉 category = "categories" 行;现在只剩 tag = "tags" 和 series = "series"(series 也无人使用,可后续考虑一并删除)
  • Hugo --minify 构建通过(221 篇,466 ms)

决策

  • 分类统一用 tag:之前 categories 和 tags 语义重叠(categories 仅 3 种且只覆盖 31 篇;tag 是文章主要分类手段);统一后所有文章都通过 tag 分组,/tags/ 页面真正反映全部分类

下次建议

  • series = "series" 在 [taxonomies] 中也是死配置(无人用 series:),可顺手删

维护记录

完成的工作

  • 把 14 篇文章中的 软路由 tag 改为 硬件(语义上 软路由 是软件配置路由器,硬件 是更广义的物理设备类目;后续硬件折腾文也归这里)

下次建议

  • tag 表仍偏多(8 个),继续精简可考虑:把 日志(97 篇,大杂烩)拆成 杂记 + 并入 开发/思考;删除 学习(已基本退役,2021 起再没用过);删除 杂谈(3 篇,可并入 杂记/思考)

维护记录

完成的工作

  • 把 50 篇文章的 开发 tag 改为 学习(包括 2 篇原本就有 学习 的:Stack by Rust / Tree by Rust,dedup 后剩 1 个 学习)
  • 顺手修了 20200406-Rails-ENV-u0k.md 的 tag: 单数 typo(之前是死配置,Hugo 不会识别),改为 tags: ["学习"]
  • Hugo --minify 通过(370 ms,221 篇)

决策

  • 学习 现在承担"技术学习/开发"语义(吸收了原 开发),覆盖 58 篇;原 学习 主要贴在 2020 年早期学习笔记上,语义自然延伸

下次建议

  • 当前 tag:日志 97 / 学习 58 / 思考 40 / 硬件 14 / 安全 6 / 杂谈 3 / 书评 1
  • 仍有 日志(大杂烩)和 杂谈(3 篇,边缘)可以继续精简

维护记录

完成的工作

  • 给全部 221 篇文章补全 description: 字段(原来只有 9 篇有内容、30 篇是空 "",其余完全缺失)
  • 日志类 94 篇:直接写日期(2020年04月06日 风格),机械处理
  • 非日志类 117 篇:4 个 subagent 并行读取正文,生成 80-150 字中文摘要(已验证 PaperMod 把 description 渲染到 meta[name=description]、og:description、twitter:description 三处)
  • 2 篇 draft 但空正文(20200407-Linux-Process-0ca / 20250115-AHK的快捷键脚本方案-0ca)用标题生成了占位描述
  • Hugo --minify 通过(288 ms,221 篇全部有 description)

决策

  • 全部 description 用中文双引号包裹(description: "..."),保持博客中文环境一致
  • 插入位置统一在 date: 行之后;空 description: "" 直接在原位替换
  • 摘要规则:不重复标题信息、客观中性、长度可控

下次建议

  • 部分早期文章(2020-2021)的标题比较模糊(如 Log 14、2020-9-19),AI 生成的 description 可能不太有意义,但仍优于完全缺失
  • 没有动 hugo.toml 中 [params] 的 description = ""(全站 fallback);如果想统一,可以改为 blog 简介

维护记录

完成的工作

scripts/ 全面审查 + 修复:

P0 严重

  • lib/git.ts 加 gitExecArgs(args[])(spawn 数组参数形式,不走 shell)
  • git-commit-push.ts:58 改用 gitExecArgs(['commit', '-m', msg]) 替代 gitExec('commit -m "${escaped}"'),修复 shell 注入漏洞(commit message 含 $(...) / 反引号 会被 execSync 解释执行)
  • gen-covers.ts 用 lib/args.ts 统一参数解析 + 在 --all / --files 模式真正支持 --dry-run(原代码忽略此 flag,跑 --all --dry-run 会真生成覆盖 220+ 个 SVG)

P1 重要

  • format-markdown.ts 抽出 buildCommand(args) 函数 + 包 import.meta.main 守卫,避免测试 import 时触发实际 execSync
  • optimize-images.ts 把 formatBytes / ratio 改为 export,加测试覆盖
  • 新增 scripts/__tests__/format-markdown.test.ts(5 个用例:默认 / –check / –check=true 字符串 / 固定 pattern)
  • 新增 scripts/__tests__/optimize-images.test.ts(8 个用例:formatBytes 三档 / ratio 正负零三种方向 / 大文件 MB / 小数精度)

验证

  • deno task test:41 passed (170 steps),0 failed(原 38 → 41,新增 13 步)
  • hugo --minify 干净(478 ms)
  • deno check TypeScript 类型干净

决策

  • gitExecArgs 接收 args: string[] 而非拼接字符串 — 整个 commit 流程里只有 commit message 这步有用户输入,其他步骤(setup bot identity / add / pull / push)都是固定字符串,继续用 gitExec 没问题,改动最小化
  • format-markdown.ts 包 import.meta.main 而不是改用函数导出模式 — 因为 prettier 是 CLI 而不是 npm 库,无法在测试里 mock 调用,只能覆盖 buildCommand 这层
  • optimize-images.ts 的 applyFormat / applyResize 没加测试 — 它们依赖 sharp pipeline 实例,真打 sharp 不算纯函数,留作后续如果要 mock sharp 时再补

下次建议

  • check-dead-links.ts 的 dry-run 行为(checked.set(url, { ok: true, status: 'skipped' }))有点反直觉,可能误导用户以为 dry-run 跑通了 — 等真要做链接健康 dashboard 时再调整
  • frontmatter.ts 不支持 block scalars(| >),目前所有 frontmatter 都是 inline 够用,但 Hugo 文档里支持,等需要再加
  • gen-covers.ts 的 injectCoverField 重复检查 /^cover:\s*$/m(line 245 + 258)读起来不够清晰,可用早返模式重构
  • 第三方 GitHub Actions 仍用浮动 tag,等哪天提醒再钉 SHA