- VERSION file as authoritative version source - export.mjs reads VERSION with package.json fallback - bw-ota.ps1 DryRun mode for safe testing - auto-setup.ps1 bumped to v3.2.0 (Phase 8 OTA)
35 lines
1.4 KiB
JavaScript
35 lines
1.4 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* patch-r3-fallback-session-id.js · 2026-04-26
|
|
* 修复 project-context-injector.js 的 unknown-session 跨会话污染:
|
|
* 无 session_id 时直接 exit, 不落缓存
|
|
* Idempotent: sentinel 'R3-FALLBACK-V2'
|
|
*/
|
|
'use strict';
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const HOOK = path.join(process.env.HOME || process.env.USERPROFILE || 'C:/Users/leesu', '.claude', 'hooks', 'project-context-injector.js');
|
|
const SENTINEL = 'R3-FALLBACK-V2';
|
|
const OLD = " const sessionId = hookData.session_id || 'unknown-session';\n const cacheKey = sessionId + '::' + cwd;";
|
|
const NEW = " // R3-FALLBACK-V2: 无 session_id 直接放弃, 防 'unknown-session' 跨会话缓存污染\n if (!hookData.session_id) process.exit(0);\n const sessionId = hookData.session_id;\n const cacheKey = sessionId + '::' + cwd;";
|
|
|
|
try {
|
|
let raw = fs.readFileSync(HOOK, 'utf8');
|
|
if (raw.includes(SENTINEL)) {
|
|
console.log('[r3-fallback] already applied, skip');
|
|
process.exit(0);
|
|
}
|
|
if (!raw.includes(OLD)) {
|
|
console.error('[r3-fallback] anchor not found, abort');
|
|
process.exit(1);
|
|
}
|
|
fs.writeFileSync(HOOK + '.bak.r3fallback.' + Date.now(), raw, 'utf8');
|
|
raw = raw.replace(OLD, NEW);
|
|
fs.writeFileSync(HOOK, raw, 'utf8');
|
|
console.log('[r3-fallback] applied');
|
|
} catch (e) {
|
|
console.error('[r3-fallback] error:', e.message);
|
|
process.exit(1);
|
|
}
|