bookworm-smart-assistant/scripts/patches/patch-w1-registry-hook-count.js

86 lines
2.9 KiB
JavaScript

#!/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();