feat: use project name as session filename fallback

Fixes #99. Falls back to git repo name or directory name when CLAUDE_SESSION_ID is unavailable.
This commit is contained in:
tchoudhary74
2026-01-29 01:01:19 -06:00
committed by GitHub
parent 899630341b
commit 81003b1ca6
2 changed files with 51 additions and 36 deletions

View File

@@ -79,17 +79,34 @@ function getTimeString() {
return `${hours}:${minutes}`; return `${hours}:${minutes}`;
} }
/**
* Get the git repository name
*/
function getGitRepoName() {
const result = runCommand('git rev-parse --show-toplevel');
if (!result.success) return null;
return path.basename(result.output);
}
/**
* Get project name from git repo or current directory
*/
function getProjectName() {
const repoName = getGitRepoName();
if (repoName) return repoName;
return path.basename(process.cwd()) || null;
}
/** /**
* Get short session ID from CLAUDE_SESSION_ID environment variable * Get short session ID from CLAUDE_SESSION_ID environment variable
* Returns the last 8 characters for uniqueness with brevity * Returns last 8 characters, falls back to project name then 'default'
* @param {string} fallback - Fallback value if no session ID (default: 'default')
*/ */
function getSessionIdShort(fallback = 'default') { function getSessionIdShort(fallback = 'default') {
const sessionId = process.env.CLAUDE_SESSION_ID; const sessionId = process.env.CLAUDE_SESSION_ID;
if (!sessionId || sessionId.length === 0) { if (sessionId && sessionId.length > 0) {
return fallback; return sessionId.slice(-8);
} }
return sessionId.slice(-8); return getProjectName() || fallback;
} }
/** /**
@@ -373,7 +390,11 @@ module.exports = {
getDateString, getDateString,
getTimeString, getTimeString,
getDateTimeString, getDateTimeString,
// Session/Project
getSessionIdShort, getSessionIdShort,
getGitRepoName,
getProjectName,
// File operations // File operations
findFiles, findFiles,

View File

@@ -106,58 +106,52 @@ function runTests() {
assert.ok(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(dt), `Expected YYYY-MM-DD HH:MM:SS, got ${dt}`); assert.ok(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(dt), `Expected YYYY-MM-DD HH:MM:SS, got ${dt}`);
})) passed++; else failed++; })) passed++; else failed++;
// Project name tests
console.log('\nProject Name Functions:');
if (test('getGitRepoName returns string or null', () => {
const repoName = utils.getGitRepoName();
assert.ok(repoName === null || typeof repoName === 'string');
})) passed++; else failed++;
if (test('getProjectName returns non-empty string', () => {
const name = utils.getProjectName();
assert.ok(name && name.length > 0);
})) passed++; else failed++;
// Session ID tests // Session ID tests
console.log('\nSession ID Functions:'); console.log('\nSession ID Functions:');
if (test('getSessionIdShort returns default when no env var', () => { if (test('getSessionIdShort falls back to project name', () => {
const originalEnv = process.env.CLAUDE_SESSION_ID; const original = process.env.CLAUDE_SESSION_ID;
delete process.env.CLAUDE_SESSION_ID; delete process.env.CLAUDE_SESSION_ID;
try { try {
const shortId = utils.getSessionIdShort(); const shortId = utils.getSessionIdShort();
assert.strictEqual(shortId, 'default'); assert.strictEqual(shortId, utils.getProjectName());
} finally { } finally {
if (originalEnv) process.env.CLAUDE_SESSION_ID = originalEnv; if (original) process.env.CLAUDE_SESSION_ID = original;
} }
})) passed++; else failed++; })) passed++; else failed++;
if (test('getSessionIdShort returns last 8 characters', () => { if (test('getSessionIdShort returns last 8 characters', () => {
const originalEnv = process.env.CLAUDE_SESSION_ID; const original = process.env.CLAUDE_SESSION_ID;
process.env.CLAUDE_SESSION_ID = 'test-session-abc12345'; process.env.CLAUDE_SESSION_ID = 'test-session-abc12345';
try { try {
const shortId = utils.getSessionIdShort(); assert.strictEqual(utils.getSessionIdShort(), 'abc12345');
assert.strictEqual(shortId, 'abc12345');
} finally { } finally {
if (originalEnv) { if (original) process.env.CLAUDE_SESSION_ID = original;
process.env.CLAUDE_SESSION_ID = originalEnv; else delete process.env.CLAUDE_SESSION_ID;
} else {
delete process.env.CLAUDE_SESSION_ID;
}
}
})) passed++; else failed++;
if (test('getSessionIdShort uses custom fallback', () => {
const originalEnv = process.env.CLAUDE_SESSION_ID;
delete process.env.CLAUDE_SESSION_ID;
try {
const shortId = utils.getSessionIdShort('custom');
assert.strictEqual(shortId, 'custom');
} finally {
if (originalEnv) process.env.CLAUDE_SESSION_ID = originalEnv;
} }
})) passed++; else failed++; })) passed++; else failed++;
if (test('getSessionIdShort handles short session IDs', () => { if (test('getSessionIdShort handles short session IDs', () => {
const originalEnv = process.env.CLAUDE_SESSION_ID; const original = process.env.CLAUDE_SESSION_ID;
process.env.CLAUDE_SESSION_ID = 'short'; process.env.CLAUDE_SESSION_ID = 'short';
try { try {
const shortId = utils.getSessionIdShort(); assert.strictEqual(utils.getSessionIdShort(), 'short');
assert.strictEqual(shortId, 'short');
} finally { } finally {
if (originalEnv) { if (original) process.env.CLAUDE_SESSION_ID = original;
process.env.CLAUDE_SESSION_ID = originalEnv; else delete process.env.CLAUDE_SESSION_ID;
} else {
delete process.env.CLAUDE_SESSION_ID;
}
} }
})) passed++; else failed++; })) passed++; else failed++;