#!/usr/bin/env node /** * W1 补丁 — 2026-04-20 系统自检 * * 问题: SKILL-REGISTRY.md 钩子清单标题声明 "16 注册条目/16 唯一文件" * 与 settings.json 实际注册的 17 条 hook 不一致 * (stats-compiled.json.summary.hooksRegistered = 17 已确认) * * 修复方案: * 1. 替换 line 255 "## 钩子清单 (16 注册条目/16 唯一文件 ..." → "17 注册条目/17 唯一文件" * 2. 替换 line 257 "### 活跃注册 — settings.json 条目 (16)" → "(17)" * * 幂等: sentinel = 'REGISTRY_HOOK_COUNT_17_PATCH_2026_04_20' * 原子性: .bak 备份 + 临时文件 + rename */ 'use strict'; const fs = require('fs'); const path = require('path'); const CLAUDE_ROOT = path.join(__dirname, '..', '..'); const TARGET = path.join(CLAUDE_ROOT, 'SKILL-REGISTRY.md'); const BACKUP = TARGET + '.bak'; const TMP = TARGET + '.tmp'; const SENTINEL = 'REGISTRY_HOOK_COUNT_17_PATCH_2026_04_20'; function main() { if (!fs.existsSync(TARGET)) { console.error('[patch-w1] 目标文件不存在:', TARGET); process.exit(1); } const before = fs.readFileSync(TARGET, 'utf8'); // 幂等: 检查新值是否已存在且旧值已消失 const oldTitle = '## 钩子清单 (16 注册条目/16 唯一文件'; const newTitle = '## 钩子清单 (17 注册条目/17 唯一文件'; const oldSubtitle = '### 活跃注册 — settings.json 条目 (16)'; const newSubtitle = '### 活跃注册 — settings.json 条目 (17)'; if (!before.includes(oldTitle) && before.includes(newTitle)) { console.log('[patch-w1] 已打过补丁 (新值已存在,旧值已消失),跳过'); process.exit(0); } if (!before.includes(oldTitle)) { console.error('[patch-w1] 找不到旧标题锚点,文件结构已变更:', oldTitle); process.exit(2); } if (!before.includes(oldSubtitle)) { console.error('[patch-w1] 找不到旧子标题锚点:', oldSubtitle); process.exit(3); } // 备份 fs.copyFileSync(TARGET, BACKUP); console.log('[patch-w1] 已备份:', BACKUP); // 执行替换 let after = before.replace(oldTitle, newTitle); after = after.replace(oldSubtitle, newSubtitle); // 验证替换成功 if (after.includes(oldTitle) || after.includes(oldSubtitle)) { console.error('[patch-w1] 替换后仍含旧值,异常中止'); process.exit(4); } if (!after.includes(newTitle) || !after.includes(newSubtitle)) { console.error('[patch-w1] 替换后缺失新值,异常中止'); process.exit(5); } // 原子写: 临时文件 + rename fs.writeFileSync(TMP, after, 'utf8'); fs.renameSync(TMP, TARGET); console.log('[patch-w1] 已写入:', TARGET); console.log('[patch-w1] 修复完成:'); console.log(' - 标题: 16 注册条目/16 唯一文件 → 17 注册条目/17 唯一文件'); console.log(' - 子标题: 活跃注册 settings.json 条目 (16) → (17)'); console.log('[patch-w1] sentinel:', SENTINEL); process.exit(0); } main();