From 81003b1ca6fc52abce6ad445cf75f507e000acef Mon Sep 17 00:00:00 2001 From: tchoudhary74 <48255553+tchoudhary74@users.noreply.github.com> Date: Thu, 29 Jan 2026 01:01:19 -0600 Subject: [PATCH] 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. --- scripts/lib/utils.js | 31 +++++++++++++++++++---- tests/lib/utils.test.js | 56 ++++++++++++++++++----------------------- 2 files changed, 51 insertions(+), 36 deletions(-) diff --git a/scripts/lib/utils.js b/scripts/lib/utils.js index ce0a05c..ee7f785 100644 --- a/scripts/lib/utils.js +++ b/scripts/lib/utils.js @@ -79,17 +79,34 @@ function getTimeString() { 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 - * Returns the last 8 characters for uniqueness with brevity - * @param {string} fallback - Fallback value if no session ID (default: 'default') + * Returns last 8 characters, falls back to project name then 'default' */ function getSessionIdShort(fallback = 'default') { const sessionId = process.env.CLAUDE_SESSION_ID; - if (!sessionId || sessionId.length === 0) { - return fallback; + if (sessionId && sessionId.length > 0) { + return sessionId.slice(-8); } - return sessionId.slice(-8); + return getProjectName() || fallback; } /** @@ -373,7 +390,11 @@ module.exports = { getDateString, getTimeString, getDateTimeString, + + // Session/Project getSessionIdShort, + getGitRepoName, + getProjectName, // File operations findFiles, diff --git a/tests/lib/utils.test.js b/tests/lib/utils.test.js index 0679463..96b0fde 100644 --- a/tests/lib/utils.test.js +++ b/tests/lib/utils.test.js @@ -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}`); })) 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 console.log('\nSession ID Functions:'); - if (test('getSessionIdShort returns default when no env var', () => { - const originalEnv = process.env.CLAUDE_SESSION_ID; + if (test('getSessionIdShort falls back to project name', () => { + const original = process.env.CLAUDE_SESSION_ID; delete process.env.CLAUDE_SESSION_ID; try { const shortId = utils.getSessionIdShort(); - assert.strictEqual(shortId, 'default'); + assert.strictEqual(shortId, utils.getProjectName()); } finally { - if (originalEnv) process.env.CLAUDE_SESSION_ID = originalEnv; + if (original) process.env.CLAUDE_SESSION_ID = original; } })) passed++; else failed++; 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'; try { - const shortId = utils.getSessionIdShort(); - assert.strictEqual(shortId, 'abc12345'); + assert.strictEqual(utils.getSessionIdShort(), 'abc12345'); } finally { - if (originalEnv) { - process.env.CLAUDE_SESSION_ID = originalEnv; - } 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; + if (original) process.env.CLAUDE_SESSION_ID = original; + else delete process.env.CLAUDE_SESSION_ID; } })) passed++; else failed++; 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'; try { - const shortId = utils.getSessionIdShort(); - assert.strictEqual(shortId, 'short'); + assert.strictEqual(utils.getSessionIdShort(), 'short'); } finally { - if (originalEnv) { - process.env.CLAUDE_SESSION_ID = originalEnv; - } else { - delete process.env.CLAUDE_SESSION_ID; - } + if (original) process.env.CLAUDE_SESSION_ID = original; + else delete process.env.CLAUDE_SESSION_ID; } })) passed++; else failed++;