86 lines
2.9 KiB
JavaScript
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();
|