#!/usr/bin/env node /** * patch-claude-md-review-template.js · 2026-04-25 * * 注入 Bookworm 神经网关交通灯审查模板 (方案 B+) 到 CLAUDE.md §交付自审 章节 * CLAUDE.md 受 block-sensitive-files 保护, 必须走 fs 直写补丁 * * 幂等: 检测 sentinel "Bookworm 神经网关交通灯模板" */ 'use strict'; const fs = require('fs'); const path = require('path'); const TARGET = path.join(__dirname, '..', '..', 'CLAUDE.md'); const SENTINEL = 'Bookworm 神经网关交通灯模板'; const OLD_BLOCK = `### 交付自审(代码修改后必须) - **简单修改**(单文件 <20 行):末尾附 1 行审查结论 \`审查: PASS / BLOCKED\` - **标准修改**(多文件或 >20 行):输出 4 维度审查 \`=== AI CODE REVIEW REPORT ===\`(规范/安全/质量/架构) - **安全敏感修改**(认证/加密/支付/代理):追加 \`=== RED TEAM SELF-REVIEW ===\`(5 问对抗自审) - **已有代码修改 >10 行**:追加 \`=== SEMANTIC DIFF ===\`(逐行解释原始→修改→原因→副作用)`; const NEW_BLOCK = `### 交付自审(代码修改后必须) - **简单修改**(单文件 <20 行):末尾附 1 行审查结论 \`审查: PASS / BLOCKED\` - **标准修改**(多文件或 >20 行):输出 Bookworm 神经网关交通灯审查(见下方模板) - **安全敏感修改**(认证/加密/支付/代理):追加 \`=== RED TEAM SELF-REVIEW ===\`(5 问对抗自审) - **已有代码修改 >10 行**:追加 \`=== SEMANTIC DIFF ===\`(逐行解释原始→修改→原因→副作用) #### Bookworm 神经网关交通灯模板(标准修改专用) \`\`\` ╔══ 📖 BOOKWORM CODE REVIEW · Neural Gateway v6.6 ══╗ ║ ║ ║ 🟢 规范 {规范要点:PEP/类型/lint 等} ║ ║ 🟢 安全 {安全要点:凭证/注入/认证等} ║ ║ 🟡 质量 {质量要点:测试覆盖/边界/异常} ║ ║ 🟢 架构 {架构要点:模块解耦/契约/兼容} ║ ║ ║ ║ ───────────────────────── BWR:{traceId} ✓ PASS ║ ╚═════════════════ 善读者 · 必善造 ═════════════════╝ \`\`\` **分级语义**: - 🟢 PASS — 该维度无问题或已闭环 - 🟡 WARN — 有改进空间,不阻塞交付(写明建议) - 🔴 BLOCK — 存在硬伤,必须修复后才能交付 **字段填充规则**: - \`{traceId}\`:取当前会话 BWR traceId(横幅同源) - 底部 verdict:4 维度全 🟢 → \`✓ PASS\`;任一 🟡 → \`⚠ PASS w/ NOTES\`;任一 🔴 → \`✗ BLOCKED\` - 维度内容:每行单句,禁止跨行;超长时分两行同色标识 **保留兼容**:仍允许使用 \`=== AI CODE REVIEW REPORT ===\` 朴素四维格式(用于嵌套场景如 Agent 子报告);面向用户的最终交付优先用神经网关模板。`; function main() { const src = fs.readFileSync(TARGET, 'utf8'); if (src.includes(SENTINEL)) { console.log('[review-tpl] already applied, skip'); return; } if (!src.includes(OLD_BLOCK)) { console.error('[review-tpl] anchor block not found, manual review needed'); process.exit(1); } const next = src.replace(OLD_BLOCK, NEW_BLOCK); const bak = TARGET + '.bak.review-tpl.' + Date.now(); fs.copyFileSync(TARGET, bak); const tmp = TARGET + '.tmp.' + process.pid; fs.writeFileSync(tmp, next, 'utf8'); fs.renameSync(tmp, TARGET); console.log('[review-tpl] OK, bak:', path.basename(bak)); } main();