mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-04-23 02:23:33 +08:00
Merge pull request #1495 from ratorin/fix/session-end-transcript-path-isolation
fix(hooks): isolate session-end.js filename using transcript_path UUID (#1494)
This commit is contained in:
@@ -16,6 +16,7 @@ const {
|
||||
getDateString,
|
||||
getTimeString,
|
||||
getSessionIdShort,
|
||||
sanitizeSessionId,
|
||||
getProjectName,
|
||||
ensureDir,
|
||||
readFile,
|
||||
@@ -178,19 +179,45 @@ function mergeSessionHeader(content, today, currentTime, metadata) {
|
||||
}
|
||||
|
||||
async function main() {
|
||||
// Parse stdin JSON to get transcript_path
|
||||
// Parse stdin JSON to get transcript_path; fall back to env var on missing,
|
||||
// empty, or non-string values as well as on malformed JSON.
|
||||
let transcriptPath = null;
|
||||
try {
|
||||
const input = JSON.parse(stdinData);
|
||||
transcriptPath = input.transcript_path;
|
||||
if (input && typeof input.transcript_path === 'string' && input.transcript_path.length > 0) {
|
||||
transcriptPath = input.transcript_path;
|
||||
}
|
||||
} catch {
|
||||
// Fallback: try env var for backwards compatibility
|
||||
transcriptPath = process.env.CLAUDE_TRANSCRIPT_PATH;
|
||||
// Malformed stdin: fall through to the env-var fallback below.
|
||||
}
|
||||
if (!transcriptPath) {
|
||||
const envTranscriptPath = process.env.CLAUDE_TRANSCRIPT_PATH;
|
||||
if (typeof envTranscriptPath === 'string' && envTranscriptPath.length > 0) {
|
||||
transcriptPath = envTranscriptPath;
|
||||
}
|
||||
}
|
||||
|
||||
const sessionsDir = getSessionsDir();
|
||||
const today = getDateString();
|
||||
const shortId = getSessionIdShort();
|
||||
// Derive shortId from transcript_path UUID when available, using the SAME
|
||||
// last-8-chars convention as getSessionIdShort(sessionId.slice(-8)). This keeps
|
||||
// backward compatibility for normal sessions (the derived shortId matches what
|
||||
// getSessionIdShort() would have produced from the same UUID), while making
|
||||
// every session map to a unique filename based on its own transcript UUID.
|
||||
//
|
||||
// Without this, a parent session and any `claude -p ...` subprocess spawned by
|
||||
// another Stop hook share the project-name fallback filename, and the subprocess
|
||||
// overwrites the parent's summary. See issue #1494 for full repro details.
|
||||
let shortId = null;
|
||||
if (transcriptPath) {
|
||||
const m = path.basename(transcriptPath).match(/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/i);
|
||||
if (m) {
|
||||
// Run through sanitizeSessionId() for byte-for-byte parity with
|
||||
// getSessionIdShort(sessionId.slice(-8)).
|
||||
shortId = sanitizeSessionId(m[1].slice(-8).toLowerCase());
|
||||
}
|
||||
}
|
||||
if (!shortId) { shortId = getSessionIdShort(); }
|
||||
const sessionFile = path.join(sessionsDir, `${today}-${shortId}-session.tmp`);
|
||||
const sessionMetadata = getSessionMetadata();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user