1实现原理 · 为什么它能做到
分工明确:内容分析与格式化由 Claude(LLM)完成 Step 1-6,脚本只在最后一步做排版修复(Step 7)。
Claude performs content analysis and formatting (Steps 1-6), then runs the script for typography fixes (Step 7).
先检测内容类型:命中 frontmatter/标题/bold/列表/代码块/引用任一即判为 markdown,全不命中才当纯文本。
| Has `---` YAML frontmatter | Markdown |
已检测到 markdown 时给用户三选一:优化格式、保留原样、只做排版修复(后者直接改原文件)。
1. Optimize formatting (Recommended)
自动补 frontmatter:把 title/slug/summary/coverImage 等元字段写入 YAML,summary 由模型生成为 100-150 字摘要。
| `summary` | Generate engaging summary (100-150 characters) |
标题去重:若正文首行是 H1 则抽到 frontmatter 的 title 并从正文删除,避免正文再出现 H1 重复。
2. If first line is H1 → extract to frontmatter `title`, remove H1 from body
输出命名固定为 {original-filename}-formatted.md,且覆盖前会把已存在的同名产物按时间戳改名备份。
mv "{filename}-formatted.md" "{filename}-formatted.backup-$(date +%Y%m%d-%H%M%S).md"
排版脚本 main.ts 读入文件、按选项处理、再原地写回;处理是确定性的字符串/语法树变换。
writeFileSync(filePath, formattedContent, "utf-8");
脚本提供多项排版开关:CJK 强调修复、CJK/英文间距、ASCII→全角引号、frontmatter YAML 格式化。
| `scripts/quotes.ts` | Replace ASCII quotes with fullwidth quotes |
间距修复不是自研实现,而是通过 execSync 调外部 npx autocorrect-node CLI。
execSync(`npx autocorrect-node --fix "${filePath}"`, { stdio: "inherit" });
脚本依赖 remark 生态(remark-cjk-friendly / remark-frontmatter / remark-gfm / unified 等),用 YAML 库读写 frontmatter。
"remark-cjk-friendly": "^1.1.0",
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| cli | bun / npx(npx -y bun 运行 main.ts) |
| package | autocorrect-node(npx 第三方 CLI,由 autocorrect.ts 调起) |
| package | remark 生态(remark-cjk-friendly / remark-frontmatter / remark-gfm / unified 等) |
| network | registry.npmjs.org(依赖与 npx 包拉取来源) |
4风险提醒 风险提醒:黄色 · 留意使用
- “仅排版修复”原地改原文件 — 该路径跳过副本直接改用户源文件;虽有覆盖前备份,但只对 -formatted.md,不覆盖“原地”这一情形。
- execSync 命令注入面 — autocorrect.ts 以模板串把 filePath 插进 `npx autocorrect-node --fix "<path>"`;若路径含 shell 元字符可能被解释为命令。同类实现用 args 数组可规避。
- 跑未锁定版本的第三方 npx 包 — 默认 spacing 开启时会从 registry.npmjs.org 拉取并执行 autocorrect-node(版本不在本仓锁定),引入供应链不确定性。
- LLM 分析可能过度格式化 — 格式化规则由模型执行,Notes 的“不过度格式化/不加内容”只是提示约束,实际效果依赖模型。
- 环境依赖 — 需 Node/bun 与 npx 可用;离线或受限网络下 spacing 修复会失败(脚本 catch 后返回 false)。
5第二遍独立确认
- [ok] 无业务网络请求,仅 npx 拉包 — §3 URL 命中集中在 package-lock.json 的 registry/赞助链接;脚本无业务端点调用,唯一外发是 npx 拉 autocorrect-node。
- [ok] 本地读写与原地修改 — main.ts 以 readFileSync/writeFileSync 同路径读写;SKILL.md 的「Typography fixes only」路径直接改原文件,无副本。
- [ok] CJK 排版三能力 — emphasis(remark-cjk-friendly)、spacing(autocorrect-node)、quotes(quotes.ts 全角替换)三项在脚本职责与 SKILL.md 选项中均有对应。
- [ok] execSync 命令注入面 — autocorrect.ts 用模板串把 filePath 插进 shell 命令;同类 baoyu 版用 spawnSync(npxCmd, [...args]) 的数组形式,本版更弱,已记入 injection_surface 与 risks。
- [ok] 无凭证读取 — 目录内无 env/keychain/cookie 读取;仅检查 EXTEND.md 偏好文件是否存在(非凭证)。
- [ok] 与 baoyu 同型实现的差异 — canghe 版无 references/ 与分析底稿,目录更精简(7 文件);排版脚本形态由 spawnSync 改为 execSync。
- [ok] 依赖可复现性 — remark 生态在 package.json/package-lock.json/bun.lock 有锁定;但 npx autocorrect-node 未锁定具体版本。
6结论
535df884a21e0d2e…dd0bf35595