2026-08-07

维护记录 完成的工作 创建新文章 content/posts/20260807[0534gw].md(标题「自述 - 小学时期」),参考现有草稿 frontmatter 格式,并设置为 draft: true(不展示状态)✅ 用 gen-covers --files --force 为文章生成封面 static/images/covers/20260807[0534gw].svg(gold / patternConcentric)✅ 运行 validate-posts.js 校验通过,文章与封面一致 ✅ 遇到的问题 无 下次建议 无

2026年08月07日 · 1 分钟 · 192 字

2026-08-05

维护记录 完成的工作 创建带新 tag 书评 的文章模板:content/posts/20260805[0buk4e].md,front matter 含 tags: ["书评"]、draft: false、author: sdttttt,正文留空待用户填写。✅ 遇到的问题 无。✅ 下次建议 书评 是除 2026-08-01 精简后的 7 个核心 tag 之外的新增类别,写作时如出现多本/多主题书评,可考虑是否再细分(例如 技术书评 / 小说书评)以保持 tag 粒度与既有体系一致。 若后续 书评 文章数量持续增长,可在 content/posts/ 下补一个 _index.md 的 description 或在主页 info 中提示,方便读者筛选。

2026年08月05日 · 1 分钟 · 243 字

2026-08-01

维护记录 完成的工作 精简博客文章 tags 体系:采用方案 A(激进精简),将 content/posts/ 下 218 篇文章的 13 个 tag 收敛为 7 个。✅ 合并到 开发:工具、分布式、建站、Algorithm(子主题归并) 新增 杂谈:金钱、新闻、文字(单例容纳) 清理重复条目:3 篇文章的 tags 数组中存在同一 tag 多次出现的情况,强制去重 批量执行脚本:/tmp/consolidate-tags.mjs(Node v24,原地编辑 frontmatter 的 tags 行,其余内容保持不变) 改动文件数:14 篇(占 218 篇的 6.4%) 最终分布:日志 95 / 开发 49 / 思考 40 / 软路由 14 / 学习 10 / 安全 6 / 杂谈 3 遇到的问题 我的初步 “+9” 净变化预测在数学上出现 ±1 偏差,实际 开发 为 +4 而非 +9,原因是 20260312[0443ef].md 同时拥有 建站 与 工具,dedup 后只贡献 1 个 开发 出现次数;同样原本预测里的边界情况需用真实全局计数复核。⚠️ - 不影响最终结果,仅是粗算与精算的偏差。 下次建议 新增文章时建议优先复用现有 7 个 tag,仅在确有跨类目需求时再讨论是否扩展。 在 scripts/ 下考虑沉淀 consolidate-tags.mjs 为可重入工具,便于后续调整 tag 体系时一键重跑 + 校验;当前实现还停留在 /tmp/ 里,无版本控制。 完成的工作 (续) 修复 layouts/partials/custom_footer.html 的渲染范围:之前 1 行 stub 把 layouts/partials/footer.html 转交给 custom_footer.html,而后者只塞了 Cloudflare Analytics,等于屏蔽了 PaperMod 的全部 footer 功能,包括回顶按钮、代码复制按钮、主题切换 JS、菜单滚动位置记忆、版权/Powered by 致谢等。✅ 恢复 PaperMod 原版 _partials/footer.html 的全部内容:版权/年份、Powered by Hugo & PaperMod、#top-link 锚点和 SVG、滚动监听 JS、平滑滚动 JS、#theme-toggle JS、copy-code 按钮 JS;同时保留 PaperMod 的 {{- partial "extend_footer.html" . }} 钩子。✅ 保留 Cloudflare Web Analytics:在新版的 custom_footer.html 末尾保留原有的 {{- with site.Params.cloudflareAnalytics.token }} 注入逻辑,并 hugo --minify 构建后用 grep 校验 id=top-link / copy-code / Powered by / class=footer / menu-scroll / cf-beacon 在生成的 public/posts/.../index.html 中重新出现。✅ 遇到的问题 (续) Hugo minifier 会把 <footer class="footer"> 压缩成 <footer class=footer>,第一次 grep "class=\"footer\"" 给出 0 命中导致误判;改为匹配 class=footer 即可。无功能影响。⚠️ 下次建议 (续) 当前 custom_footer.html 用 --ultra-compact 等价于"复制粘贴 PaperMod 原内容",会带来一个问题:PaperMod 子模块后续升级 footer 时此处不会自动同步。如果想跟进官方 footer 改进,可以改用 layouts/partials/footer.html 里 {{ block "footer" . }}{{ end }} 或类似模式避免硬编码;短期内(PaperMod 不会有大改)维持现状即可。

2026年08月01日 · 2 分钟 · 948 字

2026-07-30

维护记录 完成的工作 将 scripts/rename-posts.ts 接入 .github/workflows/deploy.yml:在 Install Bun dependencies 之后、Generate covers and inject front matter 之前新增 Rename posts 步骤,使每次 master 推送自动将文章重命名为 YYYYMMDD[xxxxxx].md,并同步处理 cover SVG 与 frontmatter 引用。✅ package.json 新增 typescript@7.0.2 与 @types/bun 开发依赖,用于 CI 中编译脚本。✅ 新增 tsconfig.scripts.json:将 scripts/**/*.ts 编译输出到 scripts/dist/,noEmitOnError: false 保证即使存在类型错误也会产出 JS。✅ .gitignore 增加 scripts/dist/,避免提交 CI 产物。✅ 更新 .github/workflows/deploy.yml:安装依赖后先执行 bunx tsc -p tsconfig.scripts.json,随后所有 bun scripts/*.ts 改为 bun scripts/dist/*.js。✅ 修复 scripts/format-markdown.ts 中 execSync 的 shell: true 在 TypeScript 7 / @types/node 下产生的类型错误,改为根据平台选择 cmd.exe 或 /bin/sh。✅ 修复 scripts/__tests__/rename-posts.test.ts 的跨文件 mock.module 污染问题:在 beforeEach 中恢复真实 node:fs/promises 与 node:fs 模块,避免其它测试的 mock 影响真实 fs 集成测试。✅ 迁移到 Node v24: package.json 删除 bun-types、@types/bun,新增 @types/node@^24;移除 bun.lock,由 npm install 生成 package-lock.json。 tsconfig.scripts.json 切换到 module/moduleResolution: NodeNext,使编译产物的相对导入带上 .js 后缀。 所有脚本的 shebang 和使用说明改为 node scripts/dist/<name>.js;scripts/rename-posts.ts 的 Bun.spawn 替换为 node:child_process 的 spawn。 所有 8 个测试文件改用 node:test + 本地 expect 助手(scripts/__tests__/expect.ts),并把原本 mock node:fs/promises 的用例改为真实临时目录集成测试(inTempDir 助手),避免了 Node 实验性 --experimental-test-module-mocks 的缓存痛点。 5 个 GitHub Actions workflow(deploy.yml、test-scripts.yml、check-dead-links.yml、sync-covers.yml、validate-posts.yml)移除 oven-sh/setup-bun,改为 actions/setup-node@v4 + npm install + npx tsc + node scripts/dist/*.js。✅ 遇到的问题 tsc 首次编译报错 Cannot find type definition file for 'bun',原因是仅安装 bun-types 时 types: ["bun"] 无法解析;补充安装 @types/bun 后解决。⚠️ 编译过程中 scripts/format-markdown.ts 的 shell: true 触发类型错误,已按平台显式指定 shell 路径。⚠️ 全量 bun test 因 mock.module 在 bun:test 中跨文件持久而偶发/必发失败;已通过恢复真实模块解决。⚠️ Node 原生 ESM 不支持扩展名省略,源 TS 文件全部相对导入加上 .js 后缀。⚠️ Node 的 mock.module 只能影响后续 import(),而 ESM 模块缓存对同一次 import 复用旧导出;改用真实临时目录集成测试以绕过实验性 API。⚠️ node --test scripts/dist/__tests__/*.js 在 npm scripts 中依赖 shell 展开 glob,CI (bash) 正常;Windows 上需另行处理。⚠️ 下次建议 观察首次迁移后 CI 运行日志(Hugo on GitHub Pages、Test Scripts 等),确认 Node 工具链无回归。 如需把 npm test 在 Windows 上做成跨平台,可改用 node --test scripts/dist/__tests__(目录)或显式列举文件。

2026年07月30日 · 3 分钟 · 1204 字

2026-07-28

维护记录 完成的工作 将首页从 profileMode 切换为 PaperMod 的 Regular Mode:移除 params.profileMode 配置,新增 params.homeInfoParams,保留原有站点标题与副标题展示。✅ 新增 params.env = "production",让 PaperMod 在所有构建场景下都按生产环境处理(影响 robots、图片优化等)。✅ 新增 scripts/optimize-images.ts 图片压缩脚本,使用 sharp 对 PNG/JPEG/WebP/AVIF/GIF/TIFF 进行压缩、限制最大宽度、生成 WebP 变体;并在 package.json 中加入 sharp 开发依赖。✅ 更新 .github/workflows/deploy.yml:新增 bun install 和 Optimize images 步骤,CI 每次构建时自动为 assets/images 生成宽度不超过 1200px 的 .webp 变体,且不覆盖原图。✅ 新增 scripts/rename-posts.ts:将 content/posts/ 下的文章批量重命名为 YYYYMMDD[xxxxxx].md(方括号为字面字符),其中日期取自 frontmatter date 字段,hash 是去除 frontmatter 后的 body 用 SHA-256 取前 3 字节(24 bit)后转 base36(6 位固定长度)。配套重命名 assets/images/covers/{slug}.svg 并改写 frontmatter cover.image;用 git mv 保留历史,git 不可用时降级 fs.rename;支持 --dry-run / --verbose;已是新格式、缺 date、格式无效的文件自动跳过;目标名碰撞时按用户策略「报错停止」并列出冲突文件。✅ 新增 scripts/__tests__/rename-posts.test.ts:30 个测试覆盖 normalizeDate(三种日期格式 + 月日越界 + 补零)/ extractBody / computeHash6(确定性、长度、base36 字符集、对末尾空白敏感、SHA-256 已知向量防止误改回 djb2)/ rewriteCoverImage / buildReport(7 个集成测试覆盖有效文章、缺 date、无效 date、已是新格式、忽略 _index.md、自定义封面不重命名、封面物理缺失)/ detectCollisions。全绿(bun test 134/134 通过)。✅ 用 git rm 删除 5 对重复文章中用户指定的 5 个,同步删除对应的 5 个 cover SVG(避免 sync-covers 误判为孤儿、且这些 SVG 本来就只服务被删的 .md)。✅ 执行 bun scripts/rename-posts.ts 完成 216 篇文章 + 215 个 cover SVG 的一次性重命名;git 全部以 R (rename) 跟踪,完整保留历史。✅ 验证 bun scripts/validate-posts.ts 全绿 + hugo --minify 干净构建(265 页)。✅ 遇到的问题 用户最初理解 YYYYMMDD{6位hash}.md 时我误把方括号当成可选语法,按无方括号实现,后被纠正改为字面方括号 YYYYMMDD[xxxxxx].md(修正 computeHash6 输出格式 + 测试 + 注释)。⚠️ 用户指出 hash 用自写 djb2 不专业,改用 node:crypto 的 SHA-256(前 3 字节,分布更均匀、行业标准)。⚠️ dry-run 时脚本在 5 对文件上报告目标名碰撞,怀疑 djb2 分布问题。实际排查:4 种不同哈希(djb2 24bit / djb2 full 32bit / FNV-1a 24bit / xxhash32 24bit)以及 SHA-256 全部在完全相同的 5 对上碰撞 → 证实这 5 对 body 真的 100% 相同(完整 64 字符 SHA-256 也一致),属于历史遗留的真实重复文章,不是哈希质量问题。⚠️ 解决方案:用户手动选保留哪个,git rm 删另一个,配套 cover SVG 同步删除。 第一次 hugo --minify 后看到 public/ 里仍有 2020-10-29-log-8/ 等旧 URL,怀疑 Hugo 把新文件当旧名渲染。⚠️ 实际是 hugo 没清空 public/,旧文件残留;rm -rf public/ resources/ && hugo --minify 后正确:URL 形如 /posts/2020031100oh3i/,Hugo slugify 自动去掉方括号。⚠️ URL 全部变更:旧 /posts/2020-03-11-github-actions/ → 新 /posts/2020031100oh3i/。按用户决定不添加 alias,所有旧 URL 将 404。⚠️ 下次建议 如需进一步自定义首页信息卡片样式,可通过 assets/css/extended/*.css 覆盖 .home-info 相关样式。 旧的 /posts/{slug}/ URL 已全部失效。如未来想恢复外部链接有效性,可写一个小脚本扫描 git 历史为每篇生成 aliases frontmatter。 部署到生产后建议用 curl -I 抽查若干新旧 URL 确认 404/200 符合预期,并提交 Google Search Console 站点地图更新。

2026年07月28日 · 3 分钟 · 1452 字

2026-07-27

维护记录 完成的工作 修改 scripts/gen-covers.ts,移除 SVG 封面中的方形与菱形元素: 从 symbol 列表删除 □ 与 ◇ 删除 patternRectangles 与 patternGrid 两个图案函数,并从 PATTERN_FNS 中移除 同步更新 scripts/__tests__/gen-covers.test.ts,移除对已删除图案的引用 运行 bun test scripts/__tests__/gen-covers.test.ts,29 个测试全部通过 ✅ 合并自动修复流程到 deploy.yml: 改写 .github/workflows/deploy.yml,把 gen-covers + format-markdown 并入 build job,在 hugo --minify 之前顺序执行(gen-covers 先,format 后,一次提交无残留) 删除独立的 .github/workflows/format-markdown.yml 与 .github/workflows/gen-covers.yml scripts/git-commit-push.ts 加 git pull --rebase 兜底,避免并发 push 被拒 移除 deploy build job 的 if: github.actor != 'github-actions[bot]'(该条件在 GITHUB_TOKEN push 场景下从未生效,是死代码) 新增 permissions: contents: write 与 workflow_dispatch 触发器 效果:一次 push → 一个 bot commit → 部署的是修复后的内容(封面、格式化结果即时上线) ✅ 遇到的问题 最初计划新建独立的 auto-fix.yml workflow,但发现 GITHUB_TOKEN 推送的 commit 不会触发新 workflow run,导致封面/格式化结果延迟一次 push 才上线 ⚠️ 解决方案:直接合并到 deploy.yml,在构建前完成修复,部署的就是修复后的内容 下次建议 若后续想补充新图案,可优先加入曲线/有机形态,进一步丰富封面视觉差异 如需进一步降低 bot commit 噪音,可考虑在 git-commit-push.ts 里加 git diff-index --quiet HEAD 检查,有改动才 commit/push

2026年07月27日 · 2 分钟 · 570 字

2026-07-24

维护记录 完成的工作 修改 .github/workflows/check-dead-links.yml 中的 Check dead links 步骤,使用 || true 让该步骤始终成功,避免死链检查失败阻塞 CI ✅ 修改 scripts/check-dead-links.ts,跳过位于 ``` 与 ~~~ 围栏代码块内的链接,避免代码示例中的 URL 被误检 ✅ 为 scripts/ 下所有非环境依赖脚本补充单元测试,共 106 个测试用例全部通过;同时修复了 frontmatter.ts 嵌套对象解析和 gen-covers.ts 的 pick 函数在处理负数时的行为 ✅ 遇到的问题 无 ⚠️ 下次建议 后续可考虑将死链检查失败结果以非阻塞方式上报(如 issue 或注释),而非直接忽略

2026年07月24日 · 1 分钟 · 212 字

2026-07-22

维护记录 完成的工作 将博客默认主题从 auto 切换为 dark,访问者首次进入站点时将直接以 Dark 模式浏览 ✅ 将最近两篇文章(《意义》《关于恋爱观》)从 private: true 改为 Hugo 原生 build.list: never + render: true,在 /posts/ 列表中隐藏但保留直接访问链接 ✅ 新增 .github/workflows/gen-covers.yml,在 content/posts/**.md 变更时自动运行 bun scripts/gen-covers.ts --all --inject-fm 生成封面并注入 front matter ✅ 提取 scripts/lib/args.ts 和 scripts/lib/git.ts 共享工具,新增 scripts/git-commit-push.ts ✅ 改造 format-markdown.yml 和 gen-covers.yml,统一使用 bun scripts/git-commit-push.ts 提交变更 ✅ 新增 scripts/format-markdown.ts,format-markdown.yml 的格式化步骤改为 bun 执行 ✅ 新增 scripts/validate-posts.ts、scripts/sync-covers.ts、scripts/check-dead-links.ts 三个脚本 ✅ 抽离 scripts/lib/frontmatter.ts,gen-covers.ts 与校验脚本共享 front matter 解析 ✅ 新增 validate-posts.yml、sync-covers.yml、check-dead-links.yml 三个 workflow ✅ 精简 layouts/partials/custom_footer.html,只保留 Cloudflare Web Analytics 脚本 ✅ 遇到的问题 validate-posts.ts 初版未按 Hugo 资源规则查找 assets/ 目录,导致大量封面误报不存在,已修复为同时查找 assets/ 和 static/ ⚠️ content/posts/2020-05-09-gfs.md 使用 TOML front matter(+++),共享解析器只支持 YAML,已将其转换为 YAML 格式 ⚠️ 下次建议 无

2026年07月22日 · 2 分钟 · 599 字

2026-07-21

维护记录 完成的工作 尝试更新 PaperMod 主题子模块,确认已是最新版(154d006,v8.0-138)✅ 单独提交 content/about.md:移除 <img> 固定 width/height 属性 ✅ 重写 static/favicon.svg:从原本的几何图形改为 Claude Code 风格的字母 R favicon(深色圆角矩形 + 衬线字体 + 暖橙色渐变)✅ PaperMod 配置增强: [params.editPost] URL:每篇文章底部加"在 GitHub 编辑此页"按钮 ✅ [params.schema]:publisherType = "Person" + sameAs 社交链接(SEO)✅ [params.profileMode]:从 homeInfoParams 切到完整 profile 模式(先不放头像)✅ [params.assets]:补全 apple-touch-icon / safari-pinned-tab / mstile / theme ✅ [params.cover]:默认行为参数(responsiveImages、linkFullImages)✅ 新增品牌资源(占位,后续可换): static/apple-touch-icon.png (180×180) ✅ static/mstile-150x150.png (150×150) ✅ static/safari-pinned-tab.svg(单色字母 R)✅ assets/images/cover-default.svg(统一占位封面)✅ 给最近两篇文章加 cover:2026-07-21-love.md 和 2026-07-16-self.md ✅ 修复 profileMode 启用后首页无文章列表的问题: 创建 content/posts/_index.md(Posts section 页) ✅ 导航菜单加 “Posts” 项(weight=1) ✅ Hugo 构建验证:/posts/index.html 正常生成(16.3KB) ✅ profileMode.buttons 加 Posts / Archives / Tags 三个跳转按钮 ✅ 批量生成文章封面 SVG: 写 scripts/gen-covers.ts(TypeScript + Bun,零依赖)✅ 5 种调色板 + 8 种几何图案 + djb2 hash 选样(tags → 调色板,标题 → 图案)✅ 生成 220 个 SVG 到 assets/images/covers/(2.6MB,无标题、1200×630)✅ 给 219 篇文章 front matter 注入 cover.image 字段(YAML)✅ 手动给 2020-05-09-gfs.md(TOML front matter)加 cover 块 ✅ 跳过 1 篇已有真实封面图(kanon.md) ✅ Hugo 构建验证通过(266 页面,309ms)✅ 遇到的问题 无 下次建议 无

2026年07月21日 · 2 分钟 · 859 字

2026-04-14

维护记录 完成的工作 替换不蒜子为 Cloudflare Web Analytics ✅ 原因:不蒜子 Referer 问题导致 page PV 统计异常(所有文章显示相同数字 261) 移除:不蒜子统计代码和配置 添加:Cloudflare Web Analytics (token: 261d0f0…f822) 修改文件:hugo.toml, layouts/partials/custom_footer.html 将远程 URL 从 HTTPS 改为 SSH 格式 删除 layouts/_default/single.html 删除 layouts/partials/busuanzi.html(废弃文件) 删除 static/avatar.jpg(未被使用) 遇到的问题 不蒜子 Referer 被火狐浏览器设置为首页而非文章页,导致 page_pv 统计串站 ⚠️ 下次建议 提交前先确认日期,避免再犯 所有改动都要写 claudelog,不需要问用户

2026年04月14日 · 1 分钟 · 249 字