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-topJS / 版权 / Powered by)
决策
- 移除 Cloudflare 站点统计:
custom_footer.html相对于 PaperMod 原版 footer 唯一真正的差异就是 Cloudflare beacon 注入;既然没用价值,把 footer 部分整体还原回 PaperMod 默认,避免 PaperMod 升级 footer 时本地 fork 不同步的问题(2026-08-01已记录此风险) - 保留
layouts/_partials/cover.html:该 override 解决了 PaperModresources.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:字段(都是 inlinecategories: ["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 时触发实际 execSyncoptimize-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 checkTypeScript 类型干净
决策
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